Rats are now eatable. Also made their selection box move smoothly.
authorPerttu Ahola <celeron55@gmail.com>
Sat, 30 Jul 2011 15:51:15 +0000 (18:51 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Sat, 30 Jul 2011 15:51:15 +0000 (18:51 +0300)
src/content_cao.h
src/content_inventory.cpp
src/content_inventory.h
src/content_sao.cpp
src/content_sao.h
src/game.cpp
src/inventory.cpp
src/inventory.h
src/server.cpp
src/serverobject.h

index b984be1361cb79d98fbf016659058cec538f65dd..319f90380f6d4a3afa4fe741386507a189215b10 100644 (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;
index 24840d6aff7a706bd43a59eafbb70a59d20acf63..de8f8e397c06d2705efb7885439e2467e8dfcb4d 100644 (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;
+}
+
+
index 0f410128ba2aed04ddab8f0985f2b321d06ff482..91550bb9a42c0e46881337024bbf8b4d08be5351 100644 (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
 
index eadaa6e5f1402f6fa7be00d3de3153cca605a6f4..638f50c9dbe674fae5dd125cbf8ed2c9abe4ebe2 100644 (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
index e5b1223d466c68c54bf221d6ceff5c1beb2dde85..060c18341e2479c7827173542024f07074f3ada5 100644 (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;
index 0afb351d147bbbaf373ae43495a38dd2ddf9a3f2..74b8e50298e7d386afb49a4efd00c6c05ab7e257 100644 (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
index 7ef7f0138ab89a88b53929cb98e05d81b5d0838e..ca050614fd5254de05a16729718354d009a40ff4 100644 (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
index 5c64f89bb20e9bb65fe084da289493fb7309f08a..66b1cd1f0f26de5875882079a97eef371b0be18f 100644 (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
        */
index e2e6ce46b04ceb37dd5a8350b4a58e8ad7473988..ab60be5cc1f323ef1705afd72ca3b75ff4a3b3d1 100644 (file)
@@ -2368,77 +2368,94 @@ 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;
-                               }
+                                       InventoryList *ilist = player->inventory.getList("main");
+                                       if(ilist != NULL)
+                                       {
+                                               // Skip if inventory has no free space
+                                               if(ilist->getUsedSlots() == ilist->getSize())
+                                               {
+                                                       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);
+                                               // 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;
+                                               // Remove object from environment
+                                               obj->m_removed = true;
+                                       }
                                }
-                               else
-                               {
-                                       /*
-                                               Item cannot be picked up. Punch it instead.
-                                       */
+                       }
+                       else
+                       {
+                               /*
+                                       Item cannot be picked up. Punch it instead.
+                               */
 
-                                       ToolItem *titem = NULL;
-                                       std::string toolname = "";
+                               ToolItem *titem = NULL;
+                               std::string toolname = "";
 
-                                       InventoryList *mlist = player->inventory.getList("main");
-                                       if(mlist != NULL)
+                               InventoryList *mlist = player->inventory.getList("main");
+                               if(mlist != NULL)
+                               {
+                                       InventoryItem *item = mlist->getItem(item_i);
+                                       if(item && (std::string)item->getName() == "ToolItem")
                                        {
-                                               InventoryItem *item = mlist->getItem(item_i);
-                                               if(item && (std::string)item->getName() == "ToolItem")
-                                               {
-                                                       titem = (ToolItem*)item;
-                                                       toolname = titem->getToolName();
-                                               }
+                                               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);
-                                       }
+                               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)
        {
index c008bf93eebfa24e5a042518e3f910f5481c26d7..01f199a4b59f406ea11f9a60e35baff35e10a3bc 100644 (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