LUA StopTimer(Spawn, "function_name") added, LUA function cleanup

Added LUA StopTimer(Spawn, "function_name") support, leave the function_name as an empty string to delete ALL timers tied to the spawn
LUA Functions cleanup continues, reset function stack after arguments are obtained (on-going patch work)
This commit is contained in:
Image 2021-09-03 14:38:04 -04:00
parent 211d24cbdf
commit 386e89215a
5 changed files with 198 additions and 89 deletions

View file

@ -3376,6 +3376,7 @@ int EQ2Emu_lua_QuestReturnNPC(lua_State* state) {
return 0;
Quest* quest = lua_interface->GetQuest(state);
int32 spawn_id = lua_interface->GetInt32Value(state, 2);
lua_interface->ResetFunctionStack(state);
if (quest && spawn_id > 0)
quest->SetQuestReturnNPC(spawn_id);
return 0;
@ -3386,26 +3387,26 @@ int EQ2Emu_lua_AddTimer(lua_State* state) {
return 0;
Spawn* spawn = lua_interface->GetSpawn(state);
int32 time = lua_interface->GetInt32Value(state, 2);
string function = lua_interface->GetStringValue(state, 3);
int32 max_count = lua_interface->GetInt32Value(state, 4);
Spawn* player = lua_interface->GetSpawn(state, 5);
lua_interface->ResetFunctionStack(state);
if (!spawn) {
lua_interface->LogError("%s: LUA AddTimer command error: spawn is not valid", lua_interface->GetScriptName(state));
return 0;
}
int32 time = lua_interface->GetInt32Value(state, 2);
if (time <= 0) {
lua_interface->LogError("%s: LUA AddTimer command error: time is not set", lua_interface->GetScriptName(state));
return 0;
}
string function = lua_interface->GetStringValue(state, 3);
if (function.length() == 0) {
lua_interface->LogError("%s: LUA AddTimer command error: function is not set", lua_interface->GetScriptName(state));
return 0;
}
int32 max_count = lua_interface->GetInt32Value(state, 4);
Spawn* player = lua_interface->GetSpawn(state, 5);
SpawnScriptTimer* timer = new SpawnScriptTimer;
if ( time < 10)
time = 10;
@ -3423,11 +3424,33 @@ int EQ2Emu_lua_AddTimer(lua_State* state) {
return 0;
}
int EQ2Emu_lua_StopTimer(lua_State* state) {
if (!lua_interface)
return 0;
Spawn* spawn = lua_interface->GetSpawn(state);
string function = lua_interface->GetStringValue(state, 2);
lua_interface->ResetFunctionStack(state);
if (!spawn) {
lua_interface->LogError("%s: LUA StopTimer command error: spawn is not valid", lua_interface->GetScriptName(state));
return 0;
}
if(!spawn->GetZone()) {
lua_interface->LogError("%s: LUA StopTimer command error: spawn has no zone to check spawn timers", lua_interface->GetScriptName(state));
return 0;
}
spawn->GetZone()->StopSpawnScriptTimer(spawn, function);
return 0;
}
int EQ2Emu_lua_GetQuest(lua_State* state) {
if (!lua_interface)
return 0;
Spawn* player = lua_interface->GetSpawn(state);
int32 quest_id = lua_interface->GetInt32Value(state, 2);
lua_interface->ResetFunctionStack(state);
if (player && player->IsPlayer() && quest_id > 0) {
lua_interface->SetQuestValue(state, ((Player*)player)->player_quests[quest_id]);
return 1;
@ -3440,6 +3463,7 @@ int EQ2Emu_lua_QuestIsComplete(lua_State* state) {
return 0;
Spawn* player = lua_interface->GetSpawn(state);
int32 quest_id = lua_interface->GetInt32Value(state, 2);
lua_interface->ResetFunctionStack(state);
if (player && player->IsPlayer() && quest_id > 0 && (((Player*)player)->player_quests.count(quest_id) > 0)) {
Quest* quest = ((Player*)player)->player_quests[quest_id];
if (quest)
@ -3454,6 +3478,7 @@ int EQ2Emu_lua_HasCompletedQuest(lua_State* state) {
return 0;
Spawn* player = lua_interface->GetSpawn(state);
int32 quest_id = lua_interface->GetInt32Value(state, 2);
lua_interface->ResetFunctionStack(state);
if (player && player->IsPlayer() && quest_id > 0) {
lua_interface->SetBooleanValue(state, (((Player*)player)->GetCompletedQuest(quest_id) != 0));
return 1;
@ -3466,6 +3491,7 @@ int EQ2Emu_lua_ProvidesQuest(lua_State* state) {
return 0;
Spawn* npc = lua_interface->GetSpawn(state);
int32 quest_id = lua_interface->GetInt32Value(state, 2);
lua_interface->ResetFunctionStack(state);
if (npc && !npc->IsPlayer() && quest_id > 0)
npc->AddProvidedQuest(quest_id);
return 0;
@ -3478,6 +3504,7 @@ int EQ2Emu_lua_OfferQuest(lua_State* state) {
Spawn* player = lua_interface->GetSpawn(state, 2);
int32 quest_id = lua_interface->GetInt32Value(state, 3);
bool forced = lua_interface->GetBooleanValue(state, 4);
lua_interface->ResetFunctionStack(state);
/* NPC is allowed to be null */
if (player && player->IsPlayer() && quest_id > 0) {
@ -3513,8 +3540,9 @@ int EQ2Emu_lua_AddQuestPrereqClass(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int8 class_id = lua_interface->GetInt8Value(state, 2);
lua_interface->ResetFunctionStack(state);
if (quest) {
int8 class_id = lua_interface->GetInt8Value(state, 2);
quest->AddPrereqClass(class_id);
}
return 0;
@ -3524,8 +3552,9 @@ int EQ2Emu_lua_AddQuestPrereqRace(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int8 race = lua_interface->GetInt8Value(state, 2);
lua_interface->ResetFunctionStack(state);
if (quest) {
int8 race = lua_interface->GetInt8Value(state, 2);
quest->AddPrereqRace(race);
}
return 0;
@ -3535,8 +3564,9 @@ int EQ2Emu_lua_AddQuestPrereqModelType(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int16 model_type = lua_interface->GetInt16Value(state, 2);
lua_interface->ResetFunctionStack(state);
if (quest) {
int16 model_type = lua_interface->GetInt16Value(state, 2);
quest->AddPrereqModelType(model_type);
}
return 0;
@ -3547,12 +3577,14 @@ int EQ2Emu_lua_AddQuestPrereqTradeskillLevel(lua_State* state) {
return 0;
Quest* quest = lua_interface->GetQuest(state);
int8 level = lua_interface->GetInt8Value(state, 2);
lua_interface->ResetFunctionStack(state);
if (!quest) {
lua_interface->LogError("%s: LUA AddQuestPrereqTradeskillLevel command error: quest is not valid", lua_interface->GetScriptName(state));
return 0;
}
int8 level = lua_interface->GetInt8Value(state, 2);
quest->SetPrereqTSLevel(level);
return 0;
}
@ -3562,12 +3594,13 @@ int EQ2Emu_lua_AddQuestPrereqTradeskillClass(lua_State* state) {
return 0;
Quest* quest = lua_interface->GetQuest(state);
int8 class_id = lua_interface->GetInt8Value(state, 2);
lua_interface->ResetFunctionStack(state);
if (!quest) {
lua_interface->LogError("%s: LUA AddQuestPrereqTradeskillClass command error: quest is not valid", lua_interface->GetScriptName(state));
return 0;
}
int8 class_id = lua_interface->GetInt8Value(state, 2);
quest->AddPrereqTradeskillClass(class_id);
return 0;
}
@ -3576,10 +3609,11 @@ int EQ2Emu_lua_AddQuestPrereqFaction(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int32 faction_id = lua_interface->GetInt32Value(state, 2);
sint32 min = lua_interface->GetSInt32Value(state, 3);
sint32 max = lua_interface->GetSInt32Value(state, 4);
lua_interface->ResetFunctionStack(state);
if (quest) {
int32 faction_id = lua_interface->GetInt32Value(state, 2);
sint32 min = lua_interface->GetSInt32Value(state, 3);
sint32 max = lua_interface->GetSInt32Value(state, 4);
quest->AddPrereqFaction(faction_id, min, max);
}
return 0;
@ -3589,9 +3623,10 @@ int EQ2Emu_lua_AddQuestSelectableRewardItem(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int32 item_id = lua_interface->GetInt32Value(state, 2);
int8 quantity = lua_interface->GetInt8Value(state, 3);
lua_interface->ResetFunctionStack(state);
if (quest) {
int32 item_id = lua_interface->GetInt32Value(state, 2);
int8 quantity = lua_interface->GetInt8Value(state, 3);
if (quantity == 0)
quantity = 1;
Item* master_item = master_item_list.GetItem(item_id);
@ -3629,9 +3664,10 @@ int EQ2Emu_lua_AddQuestRewardItem(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int32 item_id = lua_interface->GetInt32Value(state, 2);
int8 quantity = lua_interface->GetInt32Value(state, 3);
lua_interface->ResetFunctionStack(state);
if (quest) {
int32 item_id = lua_interface->GetInt32Value(state, 2);
int8 quantity = lua_interface->GetInt32Value(state, 3);
if (quantity == 0)
quantity = 1;
Item* master_item = master_item_list.GetItem(item_id);
@ -3648,11 +3684,12 @@ int EQ2Emu_lua_AddQuestRewardCoin(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int32 copper = lua_interface->GetInt32Value(state, 2);
int32 silver = lua_interface->GetInt32Value(state, 3);
int32 gold = lua_interface->GetInt32Value(state, 4);
int32 plat = lua_interface->GetInt32Value(state, 5);
lua_interface->ResetFunctionStack(state);
if (quest) {
int32 copper = lua_interface->GetInt32Value(state, 2);
int32 silver = lua_interface->GetInt32Value(state, 3);
int32 gold = lua_interface->GetInt32Value(state, 4);
int32 plat = lua_interface->GetInt32Value(state, 5);
quest->AddRewardCoins(copper, silver, gold, plat);
}
return 0;
@ -3664,6 +3701,7 @@ int EQ2Emu_lua_AddQuestRewardFaction(lua_State* state) {
Quest* quest = lua_interface->GetQuest(state);
int32 faction_id = lua_interface->GetInt32Value(state, 2);
sint32 amount = lua_interface->GetSInt32Value(state, 3);
lua_interface->ResetFunctionStack(state);
if (quest && faction_id > 0 && amount != 0)
quest->AddRewardFaction(faction_id, amount);
return 0;
@ -3673,8 +3711,9 @@ int EQ2Emu_lua_SetQuestRewardStatus(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int32 status = lua_interface->GetInt32Value(state, 2);
lua_interface->ResetFunctionStack(state);
if (quest) {
int32 status = lua_interface->GetInt32Value(state, 2);
quest->SetRewardStatus(status);
}
return 0;
@ -3684,8 +3723,9 @@ int EQ2Emu_lua_SetStatusTmpReward(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int32 status = lua_interface->GetInt32Value(state, 2);
lua_interface->ResetFunctionStack(state);
if (quest) {
int32 status = lua_interface->GetInt32Value(state, 2);
quest->SetStatusTmpReward(status);
}
return 0;
@ -3696,8 +3736,9 @@ int EQ2Emu_lua_SetCoinTmpReward(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int64 coins = lua_interface->GetInt64Value(state, 2);
lua_interface->ResetFunctionStack(state);
if (quest) {
int64 coins = lua_interface->GetInt64Value(state, 2);
quest->SetCoinTmpReward(coins);
}
return 0;
@ -3708,8 +3749,9 @@ int EQ2Emu_lua_SetQuestRewardComment(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
string comment = lua_interface->GetStringValue(state, 2);
lua_interface->ResetFunctionStack(state);
if (quest) {
string comment = lua_interface->GetStringValue(state, 2);
quest->SetRewardComment(comment);
}
return 0;
@ -3719,8 +3761,9 @@ int EQ2Emu_lua_SetQuestRewardExp(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int32 exp = lua_interface->GetInt32Value(state, 2);
lua_interface->ResetFunctionStack(state);
if (quest) {
int32 exp = lua_interface->GetInt32Value(state, 2);
quest->SetRewardXP(exp);
}
return 0;
@ -3728,18 +3771,18 @@ int EQ2Emu_lua_SetQuestRewardExp(lua_State* state) {
int EQ2Emu_lua_AddQuestStep(lua_State* state) {
Quest* quest = lua_interface->GetQuest(state);
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
int32 quantity = lua_interface->GetInt32Value(state, 4);
float percentage = lua_interface->GetFloatValue(state, 5);
string str_taskgroup = lua_interface->GetStringValue(state, 6);
int16 icon = lua_interface->GetInt16Value(state, 7);
int32 usableitemid = lua_interface->GetInt32Value(state, 8);
if (quest) {
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
int32 quantity = lua_interface->GetInt32Value(state, 4);
float percentage = lua_interface->GetFloatValue(state, 5);
string str_taskgroup = lua_interface->GetStringValue(state, 6);
const char* taskgroup = 0;
if (str_taskgroup.length() > 0)
taskgroup = str_taskgroup.c_str();
int16 icon = lua_interface->GetInt16Value(state, 7);
int32 usableitemid = lua_interface->GetInt32Value(state, 8);
int32 id = 0;
vector<int32>* ids = 0;
@ -3759,6 +3802,7 @@ int EQ2Emu_lua_AddQuestStep(lua_State* state) {
quest->GetPlayer()->GetZone()->SendQuestUpdates(client);
}
}
lua_interface->ResetFunctionStack(state);
return 0;
}
int EQ2Emu_lua_AddQuestStepKillLogic(lua_State* state, int8 type)
@ -3766,13 +3810,13 @@ int EQ2Emu_lua_AddQuestStepKillLogic(lua_State* state, int8 type)
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
int32 quantity = lua_interface->GetInt32Value(state, 4);
float percentage = lua_interface->GetFloatValue(state, 5);
string str_taskgroup = lua_interface->GetStringValue(state, 6);
int16 icon = lua_interface->GetInt16Value(state, 7);
if (quest) {
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
int32 quantity = lua_interface->GetInt32Value(state, 4);
float percentage = lua_interface->GetFloatValue(state, 5);
string str_taskgroup = lua_interface->GetStringValue(state, 6);
int16 icon = lua_interface->GetInt16Value(state, 7);
const char* taskgroup = 0;
if (str_taskgroup.length() > 0)
taskgroup = str_taskgroup.c_str();
@ -3795,6 +3839,7 @@ int EQ2Emu_lua_AddQuestStepKillLogic(lua_State* state, int8 type)
}
safe_delete(ids);
}
lua_interface->ResetFunctionStack(state);
return 0;
}
int EQ2Emu_lua_AddQuestStepKill(lua_State* state) {
@ -3809,12 +3854,12 @@ int EQ2Emu_lua_AddQuestStepChat(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
int32 quantity = lua_interface->GetInt32Value(state, 4);
string str_taskgroup = lua_interface->GetStringValue(state, 5);
int16 icon = lua_interface->GetInt16Value(state, 6);
if (quest) {
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
int32 quantity = lua_interface->GetInt32Value(state, 4);
string str_taskgroup = lua_interface->GetStringValue(state, 5);
int16 icon = lua_interface->GetInt16Value(state, 6);
const char* taskgroup = 0;
if (str_taskgroup.length() > 0)
taskgroup = str_taskgroup.c_str();
@ -3837,6 +3882,7 @@ int EQ2Emu_lua_AddQuestStepChat(lua_State* state) {
}
safe_delete(ids);
}
lua_interface->ResetFunctionStack(state);
return 0;
}
@ -3844,13 +3890,13 @@ int EQ2Emu_lua_AddQuestStepObtainItem(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
int32 quantity = lua_interface->GetInt32Value(state, 4);
float percentage = lua_interface->GetFloatValue(state, 5);
string str_taskgroup = lua_interface->GetStringValue(state, 6);
int16 icon = lua_interface->GetInt16Value(state, 7);
if (quest) {
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
int32 quantity = lua_interface->GetInt32Value(state, 4);
float percentage = lua_interface->GetFloatValue(state, 5);
string str_taskgroup = lua_interface->GetStringValue(state, 6);
int16 icon = lua_interface->GetInt16Value(state, 7);
const char* taskgroup = 0;
if (str_taskgroup.length() > 0)
taskgroup = str_taskgroup.c_str();
@ -3872,6 +3918,7 @@ int EQ2Emu_lua_AddQuestStepObtainItem(lua_State* state) {
}
safe_delete(ids);
}
lua_interface->ResetFunctionStack(state);
return 0;
}
@ -3879,12 +3926,12 @@ int EQ2Emu_lua_AddQuestStepZoneLoc(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
float max_variation = lua_interface->GetFloatValue(state, 4);
string str_taskgroup = lua_interface->GetStringValue(state, 5);
int16 icon = lua_interface->GetInt16Value(state, 6);
if (quest) {
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
float max_variation = lua_interface->GetFloatValue(state, 4);
string str_taskgroup = lua_interface->GetStringValue(state, 5);
int16 icon = lua_interface->GetInt16Value(state, 6);
const char* taskgroup = 0;
if (str_taskgroup.length() > 0)
taskgroup = str_taskgroup.c_str();
@ -3913,6 +3960,7 @@ int EQ2Emu_lua_AddQuestStepZoneLoc(lua_State* state) {
quest->GetPlayer()->GetZone()->SendQuestUpdates(client);
}
}
lua_interface->ResetFunctionStack(state);
return 0;
}
@ -3920,12 +3968,12 @@ int EQ2Emu_lua_AddQuestStepLocation(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
float max_variation = lua_interface->GetFloatValue(state, 4);
string str_taskgroup = lua_interface->GetStringValue(state, 5);
int16 icon = lua_interface->GetInt16Value(state, 6);
if (quest) {
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
float max_variation = lua_interface->GetFloatValue(state, 4);
string str_taskgroup = lua_interface->GetStringValue(state, 5);
int16 icon = lua_interface->GetInt16Value(state, 6);
const char* taskgroup = 0;
if (str_taskgroup.length() > 0)
taskgroup = str_taskgroup.c_str();
@ -3954,18 +4002,19 @@ int EQ2Emu_lua_AddQuestStepLocation(lua_State* state) {
quest->GetPlayer()->GetZone()->SendQuestUpdates(client);
}
}
lua_interface->ResetFunctionStack(state);
return 0;
}
int EQ2Emu_lua_AddQuestUsableItem(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
float max_variation = lua_interface->GetFloatValue(state, 4);
string str_taskgroup = lua_interface->GetStringValue(state, 5);
int16 icon = lua_interface->GetInt16Value(state, 6);
if (quest) {
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
float max_variation = lua_interface->GetFloatValue(state, 4);
string str_taskgroup = lua_interface->GetStringValue(state, 5);
int16 icon = lua_interface->GetInt16Value(state, 6);
const char* taskgroup = 0;
if (str_taskgroup.length() > 0)
taskgroup = str_taskgroup.c_str();
@ -3991,17 +4040,18 @@ int EQ2Emu_lua_AddQuestUsableItem(lua_State* state) {
quest->GetPlayer()->GetZone()->SendQuestUpdates(client);
}
}
lua_interface->ResetFunctionStack(state);
return 0;
}
int EQ2Emu_lua_AddQuestStepSpell(lua_State* state) {
Quest* quest = lua_interface->GetQuest(state);
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
int32 quantity = lua_interface->GetInt32Value(state, 4);
float percentage = lua_interface->GetFloatValue(state, 5);
string str_taskgroup = lua_interface->GetStringValue(state, 6);
int16 icon = lua_interface->GetInt16Value(state, 7);
if (quest) {
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
int32 quantity = lua_interface->GetInt32Value(state, 4);
float percentage = lua_interface->GetFloatValue(state, 5);
string str_taskgroup = lua_interface->GetStringValue(state, 6);
int16 icon = lua_interface->GetInt16Value(state, 7);
const char* taskgroup = 0;
if (str_taskgroup.length() > 0)
taskgroup = str_taskgroup.c_str();
@ -4023,6 +4073,7 @@ int EQ2Emu_lua_AddQuestStepSpell(lua_State* state) {
}
safe_delete(ids);
}
lua_interface->ResetFunctionStack(state);
return 0;
}
@ -4030,13 +4081,13 @@ int EQ2Emu_lua_AddQuestStepCraft(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
int32 quantity = lua_interface->GetInt32Value(state, 4);
float percentage = lua_interface->GetFloatValue(state, 5);
string str_taskgroup = lua_interface->GetStringValue(state, 6);
int16 icon = lua_interface->GetInt16Value(state, 7);
if (quest) {
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
int32 quantity = lua_interface->GetInt32Value(state, 4);
float percentage = lua_interface->GetFloatValue(state, 5);
string str_taskgroup = lua_interface->GetStringValue(state, 6);
int16 icon = lua_interface->GetInt16Value(state, 7);
const char* taskgroup = 0;
if (str_taskgroup.length() > 0)
taskgroup = str_taskgroup.c_str();
@ -4058,6 +4109,7 @@ int EQ2Emu_lua_AddQuestStepCraft(lua_State* state) {
}
safe_delete(ids);
}
lua_interface->ResetFunctionStack(state);
return 0;
}
@ -4065,13 +4117,13 @@ int EQ2Emu_lua_AddQuestStepHarvest(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
int32 quantity = lua_interface->GetInt32Value(state, 4);
float percentage = lua_interface->GetFloatValue(state, 5);
string str_taskgroup = lua_interface->GetStringValue(state, 6);
int16 icon = lua_interface->GetInt16Value(state, 7);
if (quest) {
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
int32 quantity = lua_interface->GetInt32Value(state, 4);
float percentage = lua_interface->GetFloatValue(state, 5);
string str_taskgroup = lua_interface->GetStringValue(state, 6);
int16 icon = lua_interface->GetInt16Value(state, 7);
const char* taskgroup = 0;
if (str_taskgroup.length() > 0)
taskgroup = str_taskgroup.c_str();
@ -4093,6 +4145,7 @@ int EQ2Emu_lua_AddQuestStepHarvest(lua_State* state) {
}
safe_delete(ids);
}
lua_interface->ResetFunctionStack(state);
return 0;
}
@ -4100,8 +4153,9 @@ int EQ2Emu_lua_SetQuestCompleteAction(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
string action = lua_interface->GetStringValue(state, 2);
lua_interface->ResetFunctionStack(state);
if (quest) {
string action = lua_interface->GetStringValue(state, 2);
if (action.length() > 0)
quest->SetCompleteAction(action);
}
@ -4112,9 +4166,10 @@ int EQ2Emu_lua_AddQuestStepCompleteAction(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int32 step = lua_interface->GetInt32Value(state, 2);
string action = lua_interface->GetStringValue(state, 3);
lua_interface->ResetFunctionStack(state);
if (quest) {
int32 step = lua_interface->GetInt32Value(state, 2);
string action = lua_interface->GetStringValue(state, 3);
if (step > 0 && action.length() > 0)
quest->AddCompleteAction(step, action);
}
@ -4125,9 +4180,10 @@ int EQ2Emu_lua_AddQuestStepProgressAction(lua_State* state) {
if (!lua_interface)
return 0;
Quest* quest = lua_interface->GetQuest(state);
int32 step = lua_interface->GetInt32Value(state, 2);
string action = lua_interface->GetStringValue(state, 3);
lua_interface->ResetFunctionStack(state);
if (quest) {
int32 step = lua_interface->GetInt32Value(state, 2);
string action = lua_interface->GetStringValue(state, 3);
if (step > 0 && action.length() > 0)
quest->AddProgressAction(step, action);
}
@ -4139,6 +4195,7 @@ int EQ2Emu_lua_UpdateQuestDescription(lua_State* state) {
return 0;
Quest* quest = lua_interface->GetQuest(state);
string description = lua_interface->GetStringValue(state, 2);
lua_interface->ResetFunctionStack(state);
if (quest && description.length() > 0)
quest->SetDescription(description);
return 0;
@ -4149,6 +4206,7 @@ int EQ2Emu_lua_SetCompletedDescription(lua_State* state) {
return 0;
Quest* quest = lua_interface->GetQuest(state);
string description = lua_interface->GetStringValue(state, 2);
lua_interface->ResetFunctionStack(state);
if (quest && description.length() > 0)
quest->SetCompletedDescription(description);
return 0;
@ -4161,6 +4219,7 @@ int EQ2Emu_lua_UpdateQuestTaskGroupDescription(lua_State* state) {
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
bool display_bullets = (lua_interface->GetInt8Value(state, 4) == 1);
lua_interface->ResetFunctionStack(state);
if (quest && step > 0 && description.length() > 0) {
quest->SetTaskGroupDescription(step, description, display_bullets);
/* if (quest->GetPlayer()) {
@ -4178,6 +4237,7 @@ int EQ2Emu_lua_UpdateQuestStepDescription(lua_State* state) {
Quest* quest = lua_interface->GetQuest(state);
int32 step = lua_interface->GetInt32Value(state, 2);
string description = lua_interface->GetStringValue(state, 3);
lua_interface->ResetFunctionStack(state);
if (quest && step > 0 && description.length() > 0) {
quest->SetStepDescription(step, description);
/*if (quest->GetPlayer()) {
@ -4192,6 +4252,7 @@ int EQ2Emu_lua_UpdateQuestStepDescription(lua_State* state) {
int EQ2Emu_lua_UpdateQuestZone(lua_State* state) {
Quest* quest = lua_interface->GetQuest(state);
string zone = lua_interface->GetStringValue(state, 2);
lua_interface->ResetFunctionStack(state);
if (quest && zone.length() > 0)
quest->SetZone(zone);
return 0;
@ -4240,6 +4301,7 @@ int EQ2Emu_lua_Harvest(lua_State* state) {
if (client)
client->Message(CHANNEL_COLOR_RED, "Invalid target for this spell.");
}
lua_interface->ResetFunctionStack(state);
return 0;
}
@ -4252,6 +4314,7 @@ int EQ2Emu_lua_Bind(lua_State* state) {
float y = lua_interface->GetFloatValue(state, 4);
float z = lua_interface->GetFloatValue(state, 5);
float h = lua_interface->GetFloatValue(state, 6);
lua_interface->ResetFunctionStack(state);
if (!spawn) {
lua_interface->LogError("%s: LUA Bind command error: spawn is not valid", lua_interface->GetScriptName(state));
@ -4290,6 +4353,7 @@ int EQ2Emu_lua_Gate(lua_State* state) {
return 0;
LuaSpell* spell = lua_interface->GetCurrentSpell(state);
Spawn* spawn = lua_interface->GetSpawn(state);
lua_interface->ResetFunctionStack(state);
if (spawn) {
if (spawn->IsPlayer()) {
Client* client = spawn->GetZone()->GetClientBySpawn(spawn);
@ -4307,6 +4371,7 @@ int EQ2Emu_lua_IsBindAllowed(lua_State* state) {
return 0;
bool ret = false;
Spawn* spawn = lua_interface->GetSpawn(state);
lua_interface->ResetFunctionStack(state);
if (spawn) {
if (spawn->IsPlayer()) {
Client* client = spawn->GetZone()->GetClientBySpawn(spawn);
@ -4323,6 +4388,7 @@ int EQ2Emu_lua_IsGateAllowed(lua_State* state) {
return 0;
bool ret = false;
Spawn* spawn = lua_interface->GetSpawn(state);
lua_interface->ResetFunctionStack(state);
if (spawn) {
if (spawn->IsPlayer()) {
Client* client = spawn->GetZone()->GetClientBySpawn(spawn);
@ -4336,6 +4402,7 @@ int EQ2Emu_lua_IsGateAllowed(lua_State* state) {
int EQ2Emu_lua_IsAlive(lua_State* state) {
Spawn* spawn = lua_interface->GetSpawn(state);
lua_interface->ResetFunctionStack(state);
if (spawn) {
lua_interface->SetBooleanValue(state, spawn->Alive());
return 1;
@ -4347,6 +4414,7 @@ int EQ2Emu_lua_IsInCombat(lua_State* state) {
if (!lua_interface)
return 0;
Spawn* spawn = lua_interface->GetSpawn(state);
lua_interface->ResetFunctionStack(state);
if (spawn && spawn->IsEntity()) {
lua_interface->SetBooleanValue(state, ((Entity*)spawn)->EngagedInCombat());
return 1;
@ -4358,6 +4426,7 @@ int EQ2Emu_lua_SendMessage(lua_State* state) {
Spawn* spawn = lua_interface->GetSpawn(state);
string message = lua_interface->GetStringValue(state, 2);
string color_str = lua_interface->GetStringValue(state, 3);
lua_interface->ResetFunctionStack(state);
int8 color = CHANNEL_NARRATIVE;
if (spawn && spawn->IsPlayer() && message.length() > 0) {
Client* client = spawn->GetZone()->GetClientBySpawn(spawn);
@ -4386,6 +4455,7 @@ int EQ2Emu_lua_SendPopUpMessage(lua_State* state) {
int8 red = lua_interface->GetInt8Value(state, 3);
int8 green = lua_interface->GetInt8Value(state, 4);
int8 blue = lua_interface->GetInt8Value(state, 5);
lua_interface->ResetFunctionStack(state);
if (!spawn) {
lua_interface->LogError("%s: LUA SendPopUpMessage command error: Spawn is not valid.", lua_interface->GetScriptName(state));
@ -4406,6 +4476,7 @@ int EQ2Emu_lua_SetServerControlFlag(lua_State* state) {
int8 param = lua_interface->GetInt8Value(state, 2);
int8 param_value = lua_interface->GetInt8Value(state, 3);
int8 value = lua_interface->GetInt8Value(state, 4);
lua_interface->ResetFunctionStack(state);
if (spawn && spawn->IsPlayer() && (param >= 1 && param <= 5)) {
Client* client = spawn->GetZone()->GetClientBySpawn(spawn);
if (client) {
@ -4442,6 +4513,7 @@ int EQ2Emu_lua_SetServerControlFlag(lua_State* state) {
int EQ2Emu_lua_ToggleTracking(lua_State* state) {
Spawn* spawn = lua_interface->GetSpawn(state);
lua_interface->ResetFunctionStack(state);
if (spawn && spawn->IsPlayer()) {
if (((Player*)spawn)->GetIsTracking())
spawn->GetZone()->AddPlayerTracking((Player*)spawn);
@ -4461,6 +4533,7 @@ int EQ2Emu_lua_AddPrimaryEntityCommand(lua_State* state) {
int16 cast_time = lua_interface->GetInt16Value(state, 7);
int32 spell_visual = lua_interface->GetInt32Value(state, 8);
bool denyListDefault = (lua_interface->GetInt8Value(state, 9) == 1);
lua_interface->ResetFunctionStack(state);
if (spawn) {
if (distance == 0)
distance = 10.0f;
@ -4486,6 +4559,7 @@ int EQ2Emu_lua_HasSpell(lua_State* state) {
Spawn* player = lua_interface->GetSpawn(state);
int32 spellid = lua_interface->GetInt32Value(state, 2);
int16 tier = lua_interface->GetInt16Value(state, 3);
lua_interface->ResetFunctionStack(state);
if (player && player->IsPlayer()) {
lua_interface->SetBooleanValue(state, ((Player*)player)->HasSpell(spellid, tier, true));
return 1;
@ -4505,6 +4579,7 @@ int EQ2Emu_lua_AddSpellBookEntry(lua_State* state) {
if (num_args > 4) {
add_to_hotbar = lua_interface->GetBooleanValue(state, 5);
}
lua_interface->ResetFunctionStack(state);
Spell* spell = master_spell_list.GetSpell(spellid, tier);
if (player && spell && player->IsPlayer()) {
Client* client = player->GetClient();
@ -4550,6 +4625,7 @@ int EQ2Emu_lua_HasFreeSlot(lua_State* state) {
if (!lua_interface)
return 0;
Spawn* player = lua_interface->GetSpawn(state);
lua_interface->ResetFunctionStack(state);
if (player && player->IsPlayer()) {
lua_interface->SetBooleanValue(state, ((Player*)player)->item_list.HasFreeSlot());
return 1;
@ -4561,6 +4637,7 @@ int EQ2Emu_lua_Attack(lua_State* state) {
if (lua_interface) {
Spawn* npc = lua_interface->GetSpawn(state);
Spawn* player = lua_interface->GetSpawn(state, 2);
lua_interface->ResetFunctionStack(state);
if (npc && player && npc->IsNPC() && player->IsPlayer())
((NPC*)npc)->AddHate((Entity*)player, 100);
}
@ -4571,6 +4648,7 @@ int EQ2Emu_lua_ApplySpellVisual(lua_State* state) {
if (lua_interface) {
Spawn* target = lua_interface->GetSpawn(state);
int32 spell_visual = lua_interface->GetInt32Value(state, 2);
lua_interface->ResetFunctionStack(state);
if (target && target->GetZone())
target->GetZone()->SendCastSpellPacket(spell_visual, target);
}
@ -4582,6 +4660,7 @@ int EQ2Emu_lua_HasCollectionsToHandIn(lua_State* state) {
if (lua_interface) {
player = lua_interface->GetSpawn(state);
lua_interface->ResetFunctionStack(state);
if (player && player->IsPlayer()) {
lua_interface->SetBooleanValue(state, ((Player*)player)->GetCollectionList()->HasCollectionsToHandIn());
return 1;
@ -4597,6 +4676,7 @@ int EQ2Emu_lua_HandInCollections(lua_State* state) {
if (lua_interface) {
player = lua_interface->GetSpawn(state);
lua_interface->ResetFunctionStack(state);
if (player && ((Player*)player)->IsPlayer() && ((Player*)player)->GetCollectionList()->HasCollectionsToHandIn())
if ((client = player->GetZone()->GetClientBySpawn(player)))
client->HandInCollections();
@ -4610,6 +4690,7 @@ int EQ2Emu_lua_UseWidget(lua_State* state) {
if (lua_interface) {
widget = lua_interface->GetSpawn(state);
lua_interface->ResetFunctionStack(state);
if (widget && widget->IsWidget())
((Widget*)widget)->HandleUse(nullptr, "");
}
@ -4626,6 +4707,7 @@ int EQ2Emu_lua_SetSpellList(lua_State* state) {
spawn = lua_interface->GetSpawn(state);
primary_list = lua_interface->GetInt32Value(state, 2);
secondary_list = lua_interface->GetInt32Value(state, 3);
lua_interface->ResetFunctionStack(state);
if (!spawn->IsNPC()) {
lua_interface->LogError("%s: LUA SetSpellList command error: Spawn was not a valid NPC", lua_interface->GetScriptName(state));
@ -4644,6 +4726,7 @@ int EQ2Emu_lua_GetPet(lua_State* state) {
if (!lua_interface)
return 0;
Spawn* spawn = lua_interface->GetSpawn(state);
lua_interface->ResetFunctionStack(state);
if (spawn) {
if (spawn->IsEntity() && ((Entity*)spawn)->GetPet()) {
lua_interface->SetSpawnValue(state, ((Entity*)spawn)->GetPet());
@ -4657,6 +4740,7 @@ int EQ2Emu_lua_GetCharmedPet(lua_State* state) {
if (!lua_interface)
return 0;
Spawn* spawn = lua_interface->GetSpawn(state);
lua_interface->ResetFunctionStack(state);
if (spawn) {
if (spawn->IsEntity() && ((Entity*)spawn)->GetCharmedPet()) {
lua_interface->SetSpawnValue(state, ((Entity*)spawn)->GetCharmedPet());
@ -4670,6 +4754,7 @@ int EQ2Emu_lua_GetDeityPet(lua_State* state) {
if (!lua_interface)
return 0;
Spawn* spawn = lua_interface->GetSpawn(state);
lua_interface->ResetFunctionStack(state);
if (spawn) {
if (spawn->IsEntity() && ((Entity*)spawn)->GetDeityPet()) {
lua_interface->SetSpawnValue(state, ((Entity*)spawn)->GetDeityPet());
@ -4683,6 +4768,7 @@ int EQ2Emu_lua_GetCosmeticPet(lua_State* state) {
if (!lua_interface)
return 0;
Spawn* spawn = lua_interface->GetSpawn(state);
lua_interface->ResetFunctionStack(state);
if (spawn) {
if (spawn->IsEntity() && ((Entity*)spawn)->GetCosmeticPet()) {
lua_interface->SetSpawnValue(state, ((Entity*)spawn)->GetCosmeticPet());
@ -4697,6 +4783,7 @@ int EQ2Emu_lua_Charm(lua_State* state) {
Spawn* owner = lua_interface->GetSpawn(state);
Spawn* pet = lua_interface->GetSpawn(state, 2);
LuaSpell* luaspell = lua_interface->GetCurrentSpell(state);
lua_interface->ResetFunctionStack(state);
if (!luaspell) {
lua_interface->LogError("%s: LUA Charm command error: Spell is not valid, charm can only be used in spell scripts.", lua_interface->GetScriptName(state));
return 0;
@ -4741,6 +4828,7 @@ int EQ2Emu_lua_GetGroup(lua_State* state) {
return 0;
Spawn* spawn = lua_interface->GetSpawn(state);
lua_interface->ResetFunctionStack(state);
if (!spawn) {
lua_interface->LogError("%s: LUA GetGroup command error: spawn is not valid", lua_interface->GetScriptName(state));
return 0;

View file

@ -292,6 +292,7 @@ int EQ2Emu_lua_QuestIsComplete(lua_State* state);
int EQ2Emu_lua_QuestReturnNPC(lua_State* state);
int EQ2Emu_lua_GetQuest(lua_State* state);
int EQ2Emu_lua_AddTimer(lua_State* state);
int EQ2Emu_lua_StopTimer(lua_State* state);
int EQ2Emu_lua_Harvest(lua_State* state);
int EQ2Emu_lua_SetCompleteFlag(lua_State* state);
int EQ2Emu_lua_CanReceiveQuest(lua_State* state);

View file

@ -1003,6 +1003,7 @@ void LuaInterface::RegisterFunctions(lua_State* state) {
lua_register(state, "MovementLoopAdd", EQ2Emu_lua_MovementLoopAdd);
lua_register(state, "GetCurrentZoneSafeLocation", EQ2Emu_lua_GetCurrentZoneSafeLocation);
lua_register(state, "AddTimer", EQ2Emu_lua_AddTimer);
lua_register(state, "StopTimer", EQ2Emu_lua_StopTimer);
lua_register(state, "Harvest", EQ2Emu_lua_Harvest);
lua_register(state, "SetAttackable", EQ2Emu_lua_SetAttackable);

View file

@ -3813,6 +3813,24 @@ void ZoneServer::ApplySetSpawnCommand(Client* client, Spawn* target, int8 type,
}
}
void ZoneServer::StopSpawnScriptTimer(Spawn* spawn, std::string functionName){
MSpawnScriptTimers.writelock(__FUNCTION__, __LINE__);
MRemoveSpawnScriptTimersList.writelock(__FUNCTION__, __LINE__);
if(spawn_script_timers.size() > 0){
set<SpawnScriptTimer*>::iterator itr;
SpawnScriptTimer* timer = 0;
for (itr = spawn_script_timers.begin(); itr != spawn_script_timers.end(); itr++) {
timer = *itr;
if(timer->spawn == spawn->GetID() && (functionName == "" || timer->function == functionName) && remove_spawn_script_timers_list.count(timer) == 0) {
itr = spawn_script_timers.erase(itr);
safe_delete(timer);
}
}
}
MRemoveSpawnScriptTimersList.releasewritelock(__FUNCTION__, __LINE__);
MSpawnScriptTimers.releasewritelock(__FUNCTION__, __LINE__);
}
void ZoneServer::DeleteSpawnScriptTimers(Spawn* spawn, bool all){
MSpawnScriptTimers.writelock(__FUNCTION__, __LINE__);
MRemoveSpawnScriptTimersList.writelock(__FUNCTION__, __LINE__);

View file

@ -681,6 +681,7 @@ public:
void UpdateClientSpawnMap(Player* player, Client* client);
void WorldTimeUpdateTrigger() { sync_game_time_timer.Trigger(); }
void StopSpawnScriptTimer(Spawn* spawn, std::string functionName);
private:
#ifndef WIN32
pthread_t ZoneThread;