rendered paste bodyIndex: src/game/CharacterHandler.cpp===================================================================--- src/game/CharacterHandler.cpp (revision 3477)+++ src/game/CharacterHandler.cpp (working copy)@@ -33,7 +33,8 @@ #include "ObjectAccessor.h" #include "Transports.h" #include "Group.h"-#include "../realmd/AuthCodes.h" +#include "../realmd/AuthCodes.h"+#include "ScriptCalls.h" void WorldSession::HandleCharEnumOpcode( WorldPacket & recv_data ) {@@ -547,6 +548,9 @@ SendNotification("GM mode is ON"); m_playerLoading = false; pCurrChar->SendAllowMove(); // may be add it to CMSG_SET_ACTIVE_MOVER handler?++ if (Script)+ Script->OnPlayerJoin(pCurrChar); } void WorldSession::HandleSetFactionAtWar( WorldPacket & recv_data )Index: src/game/ChatHandler.cpp===================================================================--- src/game/ChatHandler.cpp (revision 3477)+++ src/game/ChatHandler.cpp (working copy)@@ -32,6 +32,15 @@ #include "ObjectAccessor.h" #include "ScriptCalls.h" +extern ScriptsSet Script;+++bool ParseChatMessageToScript(Player* pl,const char* message ,uint32 type )+{+ if(!Script) return false;+ return Script->OnChatMessage(pl,message, type );+}+ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data ) { CHECK_PACKET_SIZE(recv_data,4+4+1);@@ -57,6 +66,7 @@ if (sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT) || _player->isGameMaster()) lang = LANG_UNIVERSAL; + switch(type) { case CHAT_MSG_SAY: @@ -66,7 +76,9 @@ std::string msg = ""; recv_data >> msg; - if (sChatHandler.ParseCommands(msg.c_str(), this) > 0)+ if( ParseChatMessageToScript( GetPlayer() , msg.c_str() ,type ) ) break;++ if (sChatHandler.ParseCommands(msg.c_str(), this) > 0) break; if(type == CHAT_MSG_SAY)@@ -84,7 +96,7 @@ CHECK_PACKET_SIZE(recv_data,4+4+(to.size()+1)+1); recv_data >> msg; - if(to.size() == 0)+ if(to.size() == 0) { WorldPacket data(SMSG_CHAT_PLAYER_NOT_FOUND, (to.size()+1)); data<<to;@@ -139,6 +151,8 @@ std::string msg = ""; recv_data >> msg; + if( ParseChatMessageToScript( GetPlayer() , msg.c_str() ,type ) ) break;+ if (sChatHandler.ParseCommands(msg.c_str(), this) > 0) break; @@ -156,6 +170,8 @@ std::string msg = ""; recv_data >> msg; + if( ParseChatMessageToScript( GetPlayer() , msg.c_str() ,type ) ) break;+ if (sChatHandler.ParseCommands(msg.c_str(), this) > 0) break; @@ -263,6 +279,7 @@ } } + void WorldSession::HandleTextEmoteOpcode( WorldPacket & recv_data ) { CHECK_PACKET_SIZE(recv_data,4+4+8);Index: src/game/Player.cpp===================================================================--- src/game/Player.cpp (revision 3477)+++ src/game/Player.cpp (working copy)@@ -46,6 +46,7 @@ #include "Transports.h" #include "Weather.h" #include "BattleGround.h"+#include "ScriptCalls.h" #include <cmath> @@ -11056,6 +11056,9 @@ // save pet (hunter pet level and experience and all type pets health/mana). if(Pet* pet = GetPet()) pet->SavePetToDB(PET_SAVE_AS_CURRENT);++ if (Script)+ Script->OnPlayerSave(this, MS_PLAYERSAVE_FULL); } // fast save function for item/money cheating preventing - save only inventory and money state@@ -11063,6 +11066,9 @@ { _SaveInventory(); SetUInt32ValueInDB(PLAYER_FIELD_COINAGE,GetMoney(),GetGUID());++ if (Script)+ Script->OnPlayerSave(this, MS_PLAYERSAVE_ITEMS_AND_MONEY); } void Player::_SaveActions()Index: src/game/ScriptCalls.cpp===================================================================--- src/game/ScriptCalls.cpp (revision 3477)+++ src/game/ScriptCalls.cpp (working copy)@@ -23,64 +23,75 @@ #include "Platform/Define.h" #include "ScriptCalls.h" +#include "Player.h"+#include "GameObject.h"+#include "SharedDefines.h"+#include "GossipDef.h"+#include "QuestDef.h"+#include "WorldSession.h"+ ScriptsSet Script=NULL; -bool LoadScriptingModule(char const* libName)-{- ScriptsSet testScript=new _ScriptSet;+extern void ScriptsInit();+extern void ScriptsFree();+extern bool GossipHello ( Player * player, Creature *_Creature );+extern bool GossipSelect( Player *player, Creature *_Creature,uint32 sender, uint32 action );+extern bool GossipSelectWithCode( Player *player, Creature *_Creature, uint32 sender, uint32 action, char* sCode );+extern bool QuestAccept( Player *player, Creature *_Creature, Quest *_Quest );+extern bool QuestSelect( Player *player, Creature *_Creature, Quest *_Quest );+extern bool QuestComplete( Player *player, Creature *_Creature, Quest *_Quest );+extern bool ChooseReward( Player *player, Creature *_Creature, Quest *_Quest, uint32 opt );+extern uint32 NPCDialogStatus( Player *player, Creature *_Creature );+extern bool ItemHello( Player *player, Item *_Item, Quest *_Quest );+extern bool ItemQuestAccept( Player *player, Item *_Item, Quest *_Quest );+extern bool GOHello( Player *player, GameObject *_GO );+extern bool GOQuestAccept( Player *player, GameObject *_GO, Quest *_Quest );+extern bool GOChooseReward( Player *player, GameObject *_GO, Quest *_Quest, uint32 opt );+extern bool AreaTrigger( Player *player, Quest *_Quest, uint32 triggerID );+extern bool ReceiveEmote ( Player * player, Creature *_Creature, uint32 emote_id );+extern bool OnChatMessage ( Player * player, const char* message, uint32 type );+extern void OnDeath(Creature* victim , Unit* killer );+extern void ScriptsUpdate(const time_t& diff);+extern bool OnPlayerSave ( Player *player, uint32 type);+extern bool OnPlayerJoin ( Player *player); - std::string name = strlen(libName) ? libName : MANGOS_SCRIPT_NAME;- name += MANGOS_SCRIPT_EXT;+extern CreatureAI* GetAI(Creature *_Creature ); - testScript->hScriptsLib=MANGOS_LOAD_LIBRARY(name.c_str()); - if(!testScript->hScriptsLib )- {- printf("Error loading Scripts Library %s !\n",name.c_str());- delete testScript;- return false;- }- else printf("Scripts Library %s was successfully loaded.\n",name.c_str());-- if( !(testScript->ScriptsInit =(scriptCallScriptsInit )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"ScriptsInit" ))- ||!(testScript->ScriptsFree =(scriptCallScriptsFree )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"ScriptsFree" ))- ||!(testScript->GossipHello =(scriptCallGossipHello )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"GossipHello" ))- ||!(testScript->GOChooseReward =(scriptCallGOChooseReward )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"GOChooseReward" ))- ||!(testScript->QuestAccept =(scriptCallQuestAccept )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"QuestAccept" ))- ||!(testScript->GossipSelect =(scriptCallGossipSelect )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"GossipSelect" ))- ||!(testScript->GossipSelectWithCode=(scriptCallGossipSelectWithCode)MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"GossipSelectWithCode"))- ||!(testScript->QuestSelect =(scriptCallQuestSelect )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"QuestSelect" ))- ||!(testScript->QuestComplete =(scriptCallQuestComplete )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"QuestComplete" ))- ||!(testScript->NPCDialogStatus =(scriptCallNPCDialogStatus )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"NPCDialogStatus" ))- ||!(testScript->ChooseReward =(scriptCallChooseReward )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"ChooseReward" ))- ||!(testScript->ItemHello =(scriptCallItemHello )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"ItemHello" ))- ||!(testScript->GOHello =(scriptCallGOHello )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"GOHello" ))- ||!(testScript->scriptAreaTrigger =(scriptCallAreaTrigger )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"AreaTrigger" ))- ||!(testScript->ItemQuestAccept =(scriptCallItemQuestAccept )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"ItemQuestAccept" ))- ||!(testScript->GOQuestAccept =(scriptCallGOQuestAccept )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"GOQuestAccept" ))- ||!(testScript->ReceiveEmote =(scriptCallReceiveEmote )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"ReceiveEmote" ))- ||!(testScript->GetAI =(scriptCallGetAI )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"GetAI" ))- )- {- MANGOS_CLOSE_LIBRARY(testScript->hScriptsLib);- delete testScript;- return false;- }-- //heh we are still there :P we have a valid library- //we reload script+bool LoadScriptingModule(char const* libName)+{ if(Script) {- ScriptsSet current =Script;- //todo: some check if some func from script library is called right now- Script=testScript;- current->ScriptsFree();- MANGOS_CLOSE_LIBRARY(current->hScriptsLib);- delete current;- }else- Script=testScript;+ Script->ScriptsFree();+ Script->ScriptsInit();+ return true;+ }+ + Script=new _ScriptSet;+ Script->ScriptsInit =(scriptCallScriptsInit)&ScriptsInit;+ Script->ScriptsFree =(scriptCallScriptsFree )&ScriptsFree;+ Script->GossipHello =(scriptCallGossipHello)&GossipHello;+ Script->GOChooseReward =(scriptCallGOChooseReward )&GOChooseReward;+ Script->QuestAccept =(scriptCallQuestAccept )&QuestAccept;+ Script->GossipSelect =(scriptCallGossipSelect)&GossipSelect;+ Script->GossipSelectWithCode=(scriptCallGossipSelectWithCode)&GossipSelectWithCode;+ Script->QuestSelect =(scriptCallQuestSelect)&QuestSelect;+ Script->QuestComplete =(scriptCallQuestComplete)&QuestComplete;+ Script->NPCDialogStatus =(scriptCallNPCDialogStatus)&NPCDialogStatus;+ Script->ChooseReward =(scriptCallChooseReward)&ChooseReward;+ Script->ItemHello =(scriptCallItemHello)&ItemHello;+ Script->GOHello =(scriptCallGOHello)&GOHello;+ Script->scriptAreaTrigger =(scriptCallAreaTrigger)&AreaTrigger;+ Script->ItemQuestAccept =(scriptCallItemQuestAccept)&ItemQuestAccept;+ Script->GOQuestAccept =(scriptCallGOQuestAccept)&GOQuestAccept;+ Script->GetAI =(scriptCallGetAI)&GetAI;+ Script->ReceiveEmote =(scriptCallReceiveEmote)&ReceiveEmote;+ Script->OnChatMessage =(scriptCallOnChatMessage)&OnChatMessage;+ Script->OnDeath =(scriptCallOnDeath)&OnDeath;+ Script->ScriptsUpdate =(scriptCallScriptsUpdate)&ScriptsUpdate;+ Script->OnPlayerSave =(scriptCallOnPlayerSave)&OnPlayerSave;+ Script->OnPlayerJoin =(scriptCallOnPlayerJoin)&OnPlayerJoin; - Script->ScriptsInit();-+ Script->ScriptsInit(); return true; }Index: src/game/ScriptCalls.h===================================================================--- src/game/ScriptCalls.h (revision 3477)+++ src/game/ScriptCalls.h (working copy)@@ -22,6 +22,19 @@ #include "GossipDef.h" #include "Player.h" +#define MANGOSCRIPT_PATCH_NPC_ON_EMOTE+#define MANGOSCRIPT_PATCH_CUSTOM_CHAT+#define MANGOSCRIPT_BUILD_PATCH_APPLYED++// enums++// For MangoScript OnPlayerSave+enum MS_PlayerSave+{+ MS_PLAYERSAVE_FULL = 0,+ MS_PLAYERSAVE_ITEMS_AND_MONEY = 1+};+ bool LoadScriptingModule(char const* libName = ""); typedef void(MANGOS_IMPORT * scriptCallScriptsInit) ();@@ -42,8 +55,16 @@ typedef bool(MANGOS_IMPORT * scriptCallGOQuestAccept)(Player *player, GameObject *, Quest *); typedef bool(MANGOS_IMPORT * scriptCallGOChooseReward)(Player *player, GameObject *, Quest *, uint32 opt ); typedef bool(MANGOS_IMPORT * scriptCallReceiveEmote) ( Player *player, Creature *_Creature, uint32 emote );+typedef void(MANGOS_IMPORT * scriptCallScriptsUpdate) ( const time_t& diff );+typedef bool(MANGOS_IMPORT * scriptCallOnPlayerSave) ( Player *player, uint32 type );+typedef bool(MANGOS_IMPORT * scriptCallOnPlayerJoin) ( Player *player ); typedef CreatureAI* (MANGOS_IMPORT * scriptCallGetAI) ( Creature *_Creature ); +// Called on every CHAT_* chat message (see ChatHandler.cpp to see what types are triggered)+typedef bool(MANGOS_IMPORT * scriptCallOnChatMessage )(Player *player , const char* message ,uint32 type ); //return ttue to stop the message from being displayed+typedef void(MANGOS_IMPORT * scriptCallOnDeath )(Creature* victim , Unit* killer );++ typedef struct { scriptCallScriptsInit ScriptsInit;@@ -65,6 +86,11 @@ scriptCallGOQuestAccept GOQuestAccept; scriptCallReceiveEmote ReceiveEmote; scriptCallGetAI GetAI;+ scriptCallOnChatMessage OnChatMessage;+ scriptCallOnDeath OnDeath;+ scriptCallScriptsUpdate ScriptsUpdate;+ scriptCallOnPlayerSave OnPlayerSave;+ scriptCallOnPlayerJoin OnPlayerJoin; MANGOS_LIBRARY_HANDLE hScriptsLib; }_ScriptSet,*ScriptsSet;Index: src/game/Unit.cpp===================================================================--- src/game/Unit.cpp (revision 3477)+++ src/game/Unit.cpp (working copy)@@ -38,6 +38,7 @@ #include "Util.h" #include "Totem.h" #include "TemporarySummon.h"+#include "ScriptCalls.h" #include <math.h> @@ -492,6 +493,10 @@ he->DuelComplete(0); }++ if(pVictim->GetTypeId() == TYPEID_UNIT)+ Script->OnDeath( (Creature*)pVictim, this);+ } else // if (health <= damage) {Index: src/game/World.cpp===================================================================--- src/game/World.cpp (revision 3477)+++ src/game/World.cpp (working copy)@@ -647,7 +647,7 @@ if (!scriptSchedule.empty()) ScriptsProcess(); - sBattleGroundMgr.Update(diff);+ Script->ScriptsUpdate(diff); } /// </ul>