Rats are now eatable. Also made their selection box move smoothly.

master
Perttu Ahola 2011-07-30 18:51:15 +03:00
parent 4556c212db
commit d62ae0e18b
10 changed files with 140 additions and 57 deletions

View File

@ -187,7 +187,8 @@ public:
core::aabbox3d<f32>* getSelectionBox()
{return &m_selection_box;}
v3f getPosition()
{return m_position;}
{return pos_translator.vect_show;}
//{return m_position;}
private:
core::aabbox3d<f32> m_selection_box;

View File

@ -122,3 +122,18 @@ InventoryItem* item_craft_create_cook_result(const std::string &subname)
return NULL;
}
bool item_craft_is_eatable(const std::string &subname)
{
if(subname == "cooked_rat")
return true;
return false;
}
s16 item_craft_eat_hp_change(const std::string &subname)
{
if(subname == "cooked_rat")
return 6; // 3 hearts
return 0;
}

View File

@ -37,6 +37,8 @@ ServerActiveObject* item_craft_create_object(const std::string &subname,
s16 item_craft_get_drop_count(const std::string &subname);
bool item_craft_is_cookable(const std::string &subname);
InventoryItem* item_craft_create_cook_result(const std::string &subname);
bool item_craft_is_eatable(const std::string &subname);
s16 item_craft_eat_hp_change(const std::string &subname);
#endif

View File

@ -215,6 +215,18 @@ InventoryItem * ItemSAO::createInventoryItem()
}
}
void ItemSAO::rightClick(Player *player)
{
dstream<<__FUNCTION_NAME<<std::endl;
InventoryItem *item = createInventoryItem();
if(item == NULL)
return;
bool to_be_deleted = item->use(m_env, player);
if(to_be_deleted)
m_removed = true;
}
/*
RatSAO

View File

@ -51,6 +51,7 @@ public:
std::string getStaticData();
InventoryItem* createInventoryItem();
InventoryItem* createPickedUpItem(){return createInventoryItem();}
void rightClick(Player *player);
private:
std::string m_inventorystring;
v3f m_speed_f;

View File

@ -1656,6 +1656,8 @@ void the_game(
else if(input->getRightClicked())
{
std::cout<<DTIME<<"Right-clicked object"<<std::endl;
client.clickActiveObject(1,
selected_active_object->getId(), g_selected_item);
}
}
else // selected_object == NULL

View File

@ -31,6 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "content_mapnode.h"
#include "content_inventory.h"
#include "content_sao.h"
#include "player.h"
/*
InventoryItem
@ -168,6 +169,20 @@ InventoryItem *CraftItem::createCookResult()
return item_craft_create_cook_result(m_subname);
}
bool CraftItem::use(ServerEnvironment *env, Player *player)
{
if(item_craft_is_eatable(m_subname))
{
s16 hp_change = item_craft_eat_hp_change(m_subname);
if(player->hp + hp_change > 20)
player->hp = 20;
else
player->hp += hp_change;
return true;
}
return false;
}
/*
MapBlockObjectItem DEPRECATED
TODO: Remove

View File

@ -37,6 +37,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
class ServerActiveObject;
class ServerEnvironment;
class Player;
class InventoryItem
{
@ -99,12 +100,19 @@ public:
/*
Other properties
*/
// Whether it can be cooked
virtual bool isCookable(){return false;}
// Time of cooking
virtual float getCookTime(){return 3.0;}
// Result of cooking
// Result of cooking (can randomize)
virtual InventoryItem *createCookResult(){return NULL;}
// Eat, press, activate, whatever.
// Called when item is right-clicked when lying on ground.
// If returns true, item shall be deleted.
virtual bool use(ServerEnvironment *env,
Player *player){return false;}
protected:
u16 m_count;
@ -298,11 +306,16 @@ public:
return 0;
return QUANTITY_ITEM_MAX_COUNT - m_count;
}
/*
Other properties
*/
bool isCookable();
InventoryItem *createCookResult();
bool use(ServerEnvironment *env, Player *player);
/*
Special methods
*/

View File

@ -2368,76 +2368,93 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
return;
}
// Skip if object has been removed
if(obj->m_removed)
return;
//TODO: Check that object is reasonably close
// Left click, pick object up (usually)
if(button == 0)
{
InventoryList *ilist = player->inventory.getList("main");
if(g_settings.getBool("creative_mode") == false && ilist != NULL)
{
/*
Try creating inventory item
*/
InventoryItem *item = obj->createPickedUpItem();
// Skip if inventory has no free space
if(ilist->getUsedSlots() == ilist->getSize())
if(item)
{
if(g_settings.getBool("creative_mode") == false)
{
dout_server<<"Player inventory has no free space"<<std::endl;
return;
}
// Skip if object has been removed
if(obj->m_removed)
return;
/*
Create the inventory item
*/
InventoryItem *item = obj->createPickedUpItem();
if(item)
{
// Add to inventory and send inventory
ilist->addItem(item);
UpdateCrafting(player->peer_id);
SendInventory(player->peer_id);
// Remove object from environment
obj->m_removed = true;
}
else
{
/*
Item cannot be picked up. Punch it instead.
*/
ToolItem *titem = NULL;
std::string toolname = "";
InventoryList *mlist = player->inventory.getList("main");
if(mlist != NULL)
InventoryList *ilist = player->inventory.getList("main");
if(ilist != NULL)
{
InventoryItem *item = mlist->getItem(item_i);
if(item && (std::string)item->getName() == "ToolItem")
// Skip if inventory has no free space
if(ilist->getUsedSlots() == ilist->getSize())
{
titem = (ToolItem*)item;
toolname = titem->getToolName();
dout_server<<"Player inventory has no free space"<<std::endl;
return;
}
}
v3f playerpos = player->getPosition();
v3f objpos = obj->getBasePosition();
v3f dir = (objpos - playerpos).normalize();
u16 wear = obj->punch(toolname, dir);
if(titem)
{
bool weared_out = titem->addWear(wear);
if(weared_out)
mlist->deleteItem(item_i);
// Add to inventory and send inventory
ilist->addItem(item);
UpdateCrafting(player->peer_id);
SendInventory(player->peer_id);
// Remove object from environment
obj->m_removed = true;
}
}
}
else
{
/*
Item cannot be picked up. Punch it instead.
*/
ToolItem *titem = NULL;
std::string toolname = "";
InventoryList *mlist = player->inventory.getList("main");
if(mlist != NULL)
{
InventoryItem *item = mlist->getItem(item_i);
if(item && (std::string)item->getName() == "ToolItem")
{
titem = (ToolItem*)item;
toolname = titem->getToolName();
}
}
v3f playerpos = player->getPosition();
v3f objpos = obj->getBasePosition();
v3f dir = (objpos - playerpos).normalize();
u16 wear = obj->punch(toolname, dir);
if(titem)
{
bool weared_out = titem->addWear(wear);
if(weared_out)
mlist->deleteItem(item_i);
SendInventory(player->peer_id);
}
}
}
// Right click, do something with object
if(button == 1)
{
// Track hp changes super-crappily
u16 oldhp = player->hp;
// Do stuff
obj->rightClick(player);
// Send back stuff
if(player->hp != oldhp)
{
SendPlayerHP(player);
}
}
}
else if(command == TOSERVER_GROUND_ACTION)

View File

@ -42,6 +42,7 @@ Some planning
class ServerEnvironment;
class InventoryItem;
class Player;
class ServerActiveObject : public ActiveObject
{
@ -105,6 +106,10 @@ public:
*/
virtual u16 punch(const std::string &toolname, v3f dir)
{return 0;}
/*
*/
virtual void rightClick(Player *player){}
/*
Number of players which know about this object. Object won't be