1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-08-11 17:51:04 +00:00

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

This commit is contained in:
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

@ -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)