From d121c3398a86e9e9132e6d5fb4467b1e44a84dcf Mon Sep 17 00:00:00 2001 From: Rochet2 Date: Sun, 19 May 2013 16:52:51 +0300 Subject: [PATCH] UPDATED: Eluna Made gossip to stop the spell, added mute, added player combat hooks --- src/server/LuaEngine/LuaEngine.h | 2 ++ src/server/LuaEngine/LuaFunctions.h | 5 +++-- src/server/LuaEngine/LuaHooks.cpp | 24 ++++++++++++++++++++++++ src/server/LuaEngine/UnitMethods.h | 21 ++++++++++++++++++++- src/server/game/Entities/Unit/Unit.cpp | 9 +++++++-- src/server/game/Scripting/ScriptMgr.cpp | 10 ++++++++++ src/server/game/Scripting/ScriptMgr.h | 8 ++++++++ 7 files changed, 74 insertions(+), 5 deletions(-) diff --git a/src/server/LuaEngine/LuaEngine.h b/src/server/LuaEngine/LuaEngine.h index 503aae188e..18c184a775 100644 --- a/src/server/LuaEngine/LuaEngine.h +++ b/src/server/LuaEngine/LuaEngine.h @@ -143,6 +143,8 @@ enum ServerEvents PLAYER_EVENT_ON_LOGIN_FIRST = 75, // (event, player) PLAYER_EVENT_ON_CAN_USE_ITEM = 76, // (event, player, itemEntry) PLAYER_EVENT_ON_LOOT_ITEM = 77, // (event, player, item, count) + PLAYER_EVENT_ON_ENTER_COMBAT = 78, // (event, player, enemy) + PLAYER_EVENT_ON_LEAVE_COMBAT = 79, // (event, player) SERVER_EVENT_COUNT }; diff --git a/src/server/LuaEngine/LuaFunctions.h b/src/server/LuaEngine/LuaFunctions.h index e6c935a528..c779223534 100644 --- a/src/server/LuaEngine/LuaFunctions.h +++ b/src/server/LuaEngine/LuaFunctions.h @@ -473,8 +473,9 @@ ElunaRegister UnitMethods[] = {"Emote", &LuaUnit::Emote}, // :Emote(emote) -- UNDOCUMENTED {"CountPctFromCurHealth", &LuaUnit::CountPctFromCurHealth}, // :CountPctFromCurHealth(int32 pct) -- UNDOCUMENTED {"CountPctFromMaxHealth", &LuaUnit::CountPctFromMaxHealth}, // :CountPctFromMaxHealth() -- UNDOCUMENTED - {"Dismount", &LuaUnit::Dismount}, // :Dismount() - Dismounts the unit. UNDOCUMENTED - {"Mount", &LuaUnit::Mount}, // :Mount(displayId) - Mounts the unit on the specified displayId. UNDOCUMENTED + {"Dismount", &LuaUnit::Dismount}, // :Dismount() - Dismounts the unit. UNDOCUMENTED + {"Mount", &LuaUnit::Mount}, // :Mount(displayId) - Mounts the unit on the specified displayId. UNDOCUMENTED + {"Mute", &LuaUnit::Mute}, // :Mute(time[, reason]) - Mutes the player for given time in seconds. UNDOCUMENTED /* Vehicle */ {"AddVehiclePassenger", &LuaUnit::AddVehiclePassenger}, // :AddVehiclePassenger(unit, seatId) - Adds a passenger to the vehicle by specifying a unit and seatId diff --git a/src/server/LuaEngine/LuaHooks.cpp b/src/server/LuaEngine/LuaHooks.cpp index 69219fccce..361ff1ed5b 100644 --- a/src/server/LuaEngine/LuaHooks.cpp +++ b/src/server/LuaEngine/LuaHooks.cpp @@ -280,6 +280,7 @@ class Eluna_HookScript : public HookScript lua_pushnil(sEluna->LuaState); sEluna->ExecuteCall(4, 0); } + player->SendEquipError((InventoryResult)83, item, NULL); return true; } bool OnExpire(Player* player, ItemTemplate const* proto) @@ -792,6 +793,29 @@ class Eluna_PlayerScript : public PlayerScript { public: Eluna_PlayerScript() : PlayerScript("Eluna_PlayerScript") { } + void OnPlayerEnterCombat(Player* player, Unit* enemy) + { + for (std::vector::iterator itr = sEluna->ServerEventBindings[PLAYER_EVENT_ON_ENTER_COMBAT].begin(); + itr != sEluna->ServerEventBindings[PLAYER_EVENT_ON_ENTER_COMBAT].end(); ++itr) + { + sEluna->BeginCall((*itr)); + sEluna->PushUnsigned(sEluna->LuaState, PLAYER_EVENT_ON_ENTER_COMBAT); + sEluna->PushUnit(sEluna->LuaState, player); + sEluna->PushUnit(sEluna->LuaState, enemy); + sEluna->ExecuteCall(3, 0); + } + } + void OnPlayerLeaveCombat(Player* player) + { + for (std::vector::iterator itr = sEluna->ServerEventBindings[PLAYER_EVENT_ON_LEAVE_COMBAT].begin(); + itr != sEluna->ServerEventBindings[PLAYER_EVENT_ON_LEAVE_COMBAT].end(); ++itr) + { + sEluna->BeginCall((*itr)); + sEluna->PushUnsigned(sEluna->LuaState, PLAYER_EVENT_ON_LEAVE_COMBAT); + sEluna->PushUnit(sEluna->LuaState, player); + sEluna->ExecuteCall(2, 0); + } + } void OnPVPKill(Player* killer, Player* killed) { for (std::vector::iterator itr = sEluna->ServerEventBindings[PLAYER_EVENT_ON_KILL_PLAYER].begin(); diff --git a/src/server/LuaEngine/UnitMethods.h b/src/server/LuaEngine/UnitMethods.h index 0711cc32d3..80ce497e02 100644 --- a/src/server/LuaEngine/UnitMethods.h +++ b/src/server/LuaEngine/UnitMethods.h @@ -12,6 +12,25 @@ class LuaUnit { public: + // Mute(time[, reason]) + static int Mute(lua_State* L, Unit* unit) + { + TO_PLAYER(); + + uint32 muteseconds = luaL_checkunsigned(L, 1); + const char* reason = luaL_checkstring(L, 2); + + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME); + int64 muteTime = time(NULL) + muteseconds; + player->GetSession()->m_muteTime = muteTime; + stmt->setInt64(0, muteTime); + stmt->setString(1, reason ? reason : ""); + stmt->setString(2, "Eluna"); + stmt->setUInt32(3, player->GetSession()->GetAccountId()); + LoginDatabase.Execute(stmt); + return 0; + } + // GetHeight(X, Y) static int GetHeight(lua_State* L, Unit* unit) { @@ -3651,7 +3670,7 @@ class LuaUnit str = "Priest"; break; case 6: - str = "DeathKnight"; + str = "Death Knight"; break; case 7: str = "Shaman"; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index bf73feeae1..eaa4e0312b 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -11734,6 +11734,8 @@ void Unit::SetInCombatState(bool PvP, Unit* enemy) if (!(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_MOUNTED_COMBAT)) Dismount(); } + else if(Player* player = ToPlayer()) + sScriptMgr->OnPlayerEnterCombat(player, enemy); for (Unit::ControlList::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr) { @@ -11767,8 +11769,11 @@ void Unit::ClearInCombat() else if (!isCharmed()) return; } - else - ToPlayer()->UpdatePotionCooldown(); + else if(Player* player = ToPlayer()) + { + player->UpdatePotionCooldown(); + sScriptMgr->OnPlayerLeaveCombat(player); + } RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PET_IN_COMBAT); } diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 24c475323b..1093362027 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -1368,6 +1368,16 @@ void ScriptMgr::OnPlayerUpdateZone(Player* player, uint32 newZone, uint32 newAre FOREACH_SCRIPT(PlayerScript)->OnUpdateZone(player, newZone, newArea); } +void ScriptMgr::OnPlayerEnterCombat(Player* player, Unit* enemy) +{ + FOREACH_SCRIPT(PlayerScript)->OnPlayerEnterCombat(player, enemy); +} + +void ScriptMgr::OnPlayerLeaveCombat(Player* player) +{ + FOREACH_SCRIPT(PlayerScript)->OnPlayerLeaveCombat(player); +} + // Guild void ScriptMgr::OnGuildAddMember(Guild* guild, Player* player, uint8& plRank) { diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 480a7f6cea..7392ad24e7 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -757,6 +757,12 @@ class PlayerScript : public UnitScript // Called when a player changes to a new map (after moving to new map) virtual void OnMapChanged(Player* /*player*/) { } + + // Called when a player enters combat + virtual void OnPlayerEnterCombat(Player* /*player*/, Unit* /*enemy*/) { } + + // Called when a player leaves combat + virtual void OnPlayerLeaveCombat(Player* /*player*/) { } }; class GuildScript : public ScriptObject @@ -1031,6 +1037,8 @@ class ScriptMgr void OnPlayerSave(Player* player); void OnPlayerBindToInstance(Player* player, Difficulty difficulty, uint32 mapid, bool permanent); void OnPlayerUpdateZone(Player* player, uint32 newZone, uint32 newArea); + void OnPlayerEnterCombat(Player* player, Unit* enemy); + void OnPlayerLeaveCombat(Player* player); public: /* GuildScript */