Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Author: Krizalium
- #include "_macros.fos"
- #ifdef __SERVER
- #define STATE_OFF (0)
- #define STATE_ON (1)
- #define TICK_SECONDS_FURNACE_SMALL (5)
- #define STR_FURNACE_DIALOG_DESC (10000) // Choose action
- #define STR_FURNACE_BUTTON_0_ON (10001) // On
- #define STR_FURNACE_BUTTON_0_OFF (10002) // Off
- #define STR_FURNACE_BUTTON_1 (10003) // Open
- #define PICMAP_SMALL_FURNACE_OFF (GetStrHash("art\\misc\\furnace_small_0.png"))
- #define PICMAP_SMALL_FURNACE_ON (GetStrHash("art\\misc\\furnace_small.fofrm"))
- /* TODO:
- #define DEC_WOOD_PER_TICK (1)
- #define INC_COAL_PER_TICK (1)*/
- import Item@ GetNearestItemByPid (Critter& cr, uint pid) from "utils_server";
- /***************************
- * Val0 = State of furnace.
- * Val1 = Work event id.
- ****************************/
- void DL(string str)
- {
- Log("[FURNACE] " + str + "."); // Comment to disable.
- }
- void _Init(Item& furnace, bool firstTime)
- {
- DL("Furnace Init. ID = " + furnace.Id);
- furnace.Val0 = STATE_OFF;
- furnace.SetEvent(ITEM_EVENT_SKILL, "_EventSkill");
- }
- bool _EventSkill(Item& furnace, Critter& cr, int skill)
- {
- DL("_EventSkill called by " + cr.Name + " to furnace with ID: " + furnace.Id);
- cr.ShowScreen(SCREEN_DIALOGBOX, 2, "answer_Furnace");
- cr.SayMsg(SAY_DIALOGBOX_TEXT, TEXTMSG_TEXT, STR_FURNACE_DIALOG_DESC);
- cr.SayMsg(SAY_DIALOGBOX_BUTTON(0), TEXTMSG_TEXT, IsFurnaceOn(furnace) ? STR_FURNACE_BUTTON_0_OFF : STR_FURNACE_BUTTON_0_ON);
- cr.SayMsg(SAY_DIALOGBOX_BUTTON(1), TEXTMSG_TEXT, STR_FURNACE_BUTTON_1);
- return true;
- }
- void answer_Furnace(Critter& cr, uint answerI, string&)
- {
- DL("answer_Furnace called by " + cr.Name + " with answer: " + answerI);
- Item@ furnace = GetNearestItemByPid(cr, PID_FURNACE_SMALL);
- if (!valid(furnace))
- {
- DL("answer_Furnace. Furnace isn't valid");
- return;
- }
- switch (answerI)
- {
- case 0:
- Toggle(furnace);
- break;
- case 1:
- cr.ShowContainer(null, furnace, TRANSFER_HEX_CONT_UP);
- break;
- default:
- break;
- }
- }
- void Toggle(Item& furnace)
- {
- DL("Toggle for furnace with ID: " + furnace.Id + ". Current state = " + furnace.Val0);
- if (IsFurnaceOn(furnace))
- {
- furnace.Val0 = STATE_OFF;
- furnace.PicMap = PICMAP_SMALL_FURNACE_OFF;
- // furnace.PicMap = GetStrHash("art\\misc\\furnace_small_0.png");
- furnace.AnimStayBegin = 0;
- furnace.AnimStayEnd = 0;
- furnace.LightIntensity = 0;
- furnace.LightDistance = 0;
- if (furnace.Val1 != 0)
- {
- EraseTimeEvent(furnace.Val1);
- }
- }
- else if (IsFurnaceHasWood(furnace))
- {
- furnace.Val0 = STATE_ON;
- furnace.PicMap = PICMAP_SMALL_FURNACE_ON;
- // furnace.PicMap = GetStrHash("art\\misc\\furnace_small.fofrm");;
- furnace.AnimStayBegin = 1;
- furnace.AnimStayEnd = 8;
- furnace.LightIntensity = 50;
- furnace.LightDistance = 5;
- furnace.LightColor = 113475161;
- furnace.Val1 = CreateTimeEvent(__FullSecond + REAL_SECOND(TICK_SECONDS_FURNACE_SMALL), "e_FurnaceWorkEvent", furnace.Id, true);
- }
- furnace.Update();
- }
- bool IsFurnaceHasWood(Item& furnace)
- {
- DL("IsFurnaceHasWood called. Furnace ID: " + furnace.Id);
- Item@ wood = furnace.GetItem(PID_FIREWOOD, 0);
- if (valid(wood))
- {
- return true;
- }
- DL("Furnace doesn't have wood. Furnace ID: " + furnace.Id);
- return false;
- }
- bool IsFurnaceOn(Item& furnace)
- {
- DL("IsFurnaceOn called. Furnace ID: " + furnace.Id + ". State = " + furnace.Val0);
- if (furnace.Val0 == STATE_ON)
- {
- return true;
- }
- return false;
- }
- uint e_FurnaceWorkEvent(uint[] @ values)
- {
- DL("e_FurnaceWorkEvent called");
- if (!valid(values))
- {
- DL("e_FurnaceWorkEvent is incorrect! Values aren't valid");
- }
- Item@ furnace = GetItem(values[0]);
- if (!valid(furnace))
- {
- DL("e_FurnaceWorkEvent is incorrect! Furnace isn't valid");
- }
- if (IsFurnaceHasWood(furnace) && Smelting(furnace))
- {
- return REAL_SECOND(TICK_SECONDS_FURNACE_SMALL);
- }
- else
- {
- Toggle(furnace);
- }
- return 0;
- }
- bool Smelting(Item& furnace)
- {
- DL("Smelting in furnace with ID: " + furnace.Id);
- Item@ wood = furnace.GetItem(PID_FIREWOOD, 0);
- Item@ coal = furnace.GetItem(PID_CHARCOAL, 0);
- if (!valid(wood))
- {
- DL("Smelting error. Wood aren't valid. Furnace ID: " + furnace.Id);
- return false;
- }
- uint woodCount = wood.GetCount();
- if (woodCount > 1)
- {
- wood.SetCount(woodCount - 1);
- }
- else
- {
- DeleteItem(wood);
- }
- if (valid(coal))
- {
- coal.SetCount(coal.GetCount() + 1);
- }
- else
- {
- @coal = furnace.AddItem(PID_CHARCOAL, 1, 0);
- }
- return true;
- }
- #endif
- #ifdef __CLIENT
- // TODO:
- // #include "furnace_screen.fos"
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement