Advertisement
Krizalis

Furnace shit

Apr 8th, 2020
272
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.10 KB | None | 0 0
  1. // Author: Krizalium
  2.  
  3. #include "_macros.fos"
  4.  
  5. #ifdef __SERVER
  6.  
  7. #define STATE_OFF                     (0)
  8. #define STATE_ON                      (1)
  9.  
  10. #define TICK_SECONDS_FURNACE_SMALL    (5)
  11.  
  12. #define STR_FURNACE_DIALOG_DESC       (10000)   // Choose action
  13. #define STR_FURNACE_BUTTON_0_ON       (10001)   // On
  14. #define STR_FURNACE_BUTTON_0_OFF      (10002)   // Off
  15. #define STR_FURNACE_BUTTON_1          (10003)   // Open
  16.  
  17. #define PICMAP_SMALL_FURNACE_OFF      (GetStrHash("art\\misc\\furnace_small_0.png"))
  18. #define PICMAP_SMALL_FURNACE_ON       (GetStrHash("art\\misc\\furnace_small.fofrm"))
  19.  
  20. /* TODO:
  21.    #define DEC_WOOD_PER_TICK            (1)
  22.  #define INC_COAL_PER_TICK          (1)*/
  23.  
  24. import Item@ GetNearestItemByPid (Critter& cr, uint pid) from "utils_server";
  25.  
  26. /***************************
  27.  * Val0 = State of furnace.
  28.  * Val1 = Work event id.
  29.  ****************************/
  30.  
  31. void DL(string str)
  32. {
  33.     Log("[FURNACE] " + str + ".");      // Comment to disable.
  34. }
  35.  
  36. void _Init(Item& furnace, bool firstTime)
  37. {
  38.     DL("Furnace Init. ID = " + furnace.Id);
  39.     furnace.Val0 = STATE_OFF;
  40.     furnace.SetEvent(ITEM_EVENT_SKILL, "_EventSkill");
  41. }
  42.  
  43. bool _EventSkill(Item& furnace, Critter& cr, int skill)
  44. {
  45.     DL("_EventSkill called by " + cr.Name + " to furnace with ID: " + furnace.Id);
  46.     cr.ShowScreen(SCREEN_DIALOGBOX, 2, "answer_Furnace");
  47.     cr.SayMsg(SAY_DIALOGBOX_TEXT, TEXTMSG_TEXT, STR_FURNACE_DIALOG_DESC);
  48.     cr.SayMsg(SAY_DIALOGBOX_BUTTON(0), TEXTMSG_TEXT, IsFurnaceOn(furnace) ? STR_FURNACE_BUTTON_0_OFF : STR_FURNACE_BUTTON_0_ON);
  49.     cr.SayMsg(SAY_DIALOGBOX_BUTTON(1), TEXTMSG_TEXT, STR_FURNACE_BUTTON_1);
  50.     return true;
  51. }
  52.  
  53. void answer_Furnace(Critter& cr, uint answerI, string&)
  54. {
  55.     DL("answer_Furnace called by " + cr.Name + " with answer: " + answerI);
  56.     Item@ furnace = GetNearestItemByPid(cr, PID_FURNACE_SMALL);
  57.  
  58.     if (!valid(furnace))
  59.     {
  60.         DL("answer_Furnace. Furnace isn't valid");
  61.         return;
  62.     }
  63.  
  64.     switch (answerI)
  65.     {
  66.     case 0:
  67.         Toggle(furnace);
  68.         break;
  69.     case 1:
  70.         cr.ShowContainer(null, furnace, TRANSFER_HEX_CONT_UP);
  71.         break;
  72.     default:
  73.         break;
  74.     }
  75. }
  76.  
  77. void Toggle(Item& furnace)
  78. {
  79.     DL("Toggle for furnace with ID: " + furnace.Id + ". Current state = " + furnace.Val0);
  80.  
  81.     if (IsFurnaceOn(furnace))
  82.     {
  83.         furnace.Val0 = STATE_OFF;
  84.         furnace.PicMap = PICMAP_SMALL_FURNACE_OFF;
  85.         // furnace.PicMap = GetStrHash("art\\misc\\furnace_small_0.png");
  86.  
  87.         furnace.AnimStayBegin = 0;
  88.         furnace.AnimStayEnd = 0;
  89.         furnace.LightIntensity = 0;
  90.         furnace.LightDistance = 0;
  91.  
  92.         if (furnace.Val1 != 0)
  93.         {
  94.             EraseTimeEvent(furnace.Val1);
  95.         }
  96.     }
  97.     else if (IsFurnaceHasWood(furnace))
  98.     {
  99.         furnace.Val0 = STATE_ON;
  100.         furnace.PicMap = PICMAP_SMALL_FURNACE_ON;
  101.         // furnace.PicMap = GetStrHash("art\\misc\\furnace_small.fofrm");;
  102.  
  103.         furnace.AnimStayBegin = 1;
  104.         furnace.AnimStayEnd = 8;
  105.         furnace.LightIntensity = 50;
  106.         furnace.LightDistance = 5;
  107.         furnace.LightColor = 113475161;
  108.  
  109.         furnace.Val1 = CreateTimeEvent(__FullSecond + REAL_SECOND(TICK_SECONDS_FURNACE_SMALL), "e_FurnaceWorkEvent", furnace.Id, true);
  110.     }
  111.  
  112.     furnace.Update();
  113. }
  114.  
  115.  
  116. bool IsFurnaceHasWood(Item& furnace)
  117. {
  118.     DL("IsFurnaceHasWood called. Furnace ID: " + furnace.Id);
  119.     Item@ wood = furnace.GetItem(PID_FIREWOOD, 0);
  120.  
  121.     if (valid(wood))
  122.     {
  123.         return true;
  124.     }
  125.  
  126.     DL("Furnace doesn't have wood. Furnace ID: " + furnace.Id);
  127.     return false;
  128. }
  129.  
  130.  
  131. bool IsFurnaceOn(Item& furnace)
  132. {
  133.     DL("IsFurnaceOn called. Furnace ID: " + furnace.Id + ". State = " + furnace.Val0);
  134.  
  135.     if (furnace.Val0 == STATE_ON)
  136.     {
  137.         return true;
  138.     }
  139.  
  140.     return false;
  141. }
  142.  
  143.  
  144. uint e_FurnaceWorkEvent(uint[] @ values)
  145. {
  146.     DL("e_FurnaceWorkEvent called");
  147.  
  148.     if (!valid(values))
  149.     {
  150.         DL("e_FurnaceWorkEvent is incorrect! Values aren't valid");
  151.     }
  152.  
  153.     Item@ furnace = GetItem(values[0]);
  154.  
  155.     if (!valid(furnace))
  156.     {
  157.         DL("e_FurnaceWorkEvent is incorrect! Furnace isn't valid");
  158.     }
  159.  
  160.     if (IsFurnaceHasWood(furnace) && Smelting(furnace))
  161.     {
  162.         return REAL_SECOND(TICK_SECONDS_FURNACE_SMALL);
  163.     }
  164.     else
  165.     {
  166.         Toggle(furnace);
  167.     }
  168.  
  169.     return 0;
  170. }
  171.  
  172. bool Smelting(Item& furnace)
  173. {
  174.     DL("Smelting in furnace with ID: " + furnace.Id);
  175.  
  176.     Item@ wood = furnace.GetItem(PID_FIREWOOD, 0);
  177.     Item@ coal = furnace.GetItem(PID_CHARCOAL, 0);
  178.  
  179.     if (!valid(wood))
  180.     {
  181.         DL("Smelting error. Wood aren't valid. Furnace ID: " + furnace.Id);
  182.         return false;
  183.     }
  184.  
  185.     uint woodCount = wood.GetCount();
  186.  
  187.     if (woodCount > 1)
  188.     {
  189.         wood.SetCount(woodCount - 1);
  190.     }
  191.     else
  192.     {
  193.         DeleteItem(wood);
  194.     }
  195.  
  196.     if (valid(coal))
  197.     {
  198.         coal.SetCount(coal.GetCount() + 1);
  199.     }
  200.     else
  201.     {
  202.         @coal = furnace.AddItem(PID_CHARCOAL, 1, 0);
  203.     }
  204.  
  205.     return true;
  206. }
  207.  
  208.  
  209.  
  210. #endif
  211.  
  212. #ifdef __CLIENT
  213.  
  214. // TODO:
  215. // #include "furnace_screen.fos"
  216.  
  217. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement