America 2 Postado Março 25, 2017 Share Postado Março 25, 2017 (editado) Eu estava dando uma navegada na sessão de códigos e vi que o único sistema de TV que tinha estava faltando partes então resolvi pegar e terminar o código espero que esteja funcional, provavelmente estará muito melhor que o já postado aqui pela metade. Luascript.cpp adicione: //doSendPlayerExtendedOpcode(cid, opcode, buffer) lua_register(m_luaState, "doSendPlayerExtendedOpcode", LuaScriptInterfaceluaDoSendPlayerExtendedOpcode); //getCreatureNoMove(cid) lua_register(m_luaState, "getCreatureNoMove", LuaScriptInterfaceluaGetCreatureNoMove); //doCreatureSetNoMove(cid, block) lua_register(m_luaState, "doCreatureSetNoMove", LuaScriptInterfaceluaDoCreatureSetNoMove); //doInviteToPrivateChannel(cid, msg) lua_register(m_luaState, "doInviteToPrivateChannel", LuaScriptInterfaceluaDoInviteToPrivateChannel); //doRemoveIntoPrivateChannel(cid, msg) lua_register(m_luaState, "doRemoveIntoPrivateChannel", LuaScriptInterfaceluaDoRemoveIntoPrivateChannel); //doDeletePrivateChannel(cid) lua_register(m_luaState, "doDeletePrivateChannel", LuaScriptInterfaceluaDoDeletePrivateChannel); //getCreatureHideHealth(cid) lua_register(m_luaState, "getCreatureHideHealth", LuaScriptInterfaceluaGetCreatureHideHealth); //doCreatureSetHideHealth(cid, hide) lua_register(m_luaState, "doCreatureSetHideHealth", LuaScriptInterfaceluaDoCreatureSetHideHealth); //doCreatePrivateChannel(cid) lua_register(m_luaState, "doCreatePrivateChannel", LuaScriptInterfaceluaDoCreatePrivateChannel); //doRemovePlayerTv(cid, id) lua_register(m_luaState, "removePlayerTv", LuaScriptInterfaceluaDoRemovePlayerTv); //getAllsTv() lua_register(m_luaState, "getTvs", LuaScriptInterfaceluaGetAllsTvs); //setPlayerTv(cid, player) lua_register(m_luaState, "setPlayerTv", LuaScriptInterfaceluaSetPlayerTv); //doSendChannelstTv(cid) lua_register(m_luaState, "doSendChannelsTv", LuaScriptInterfaceluaDoSendChannelsTv); Ainda em Luascript.cpp adicione: int32_t LuaScriptInterfaceluaGetCreatureHideHealth(lua_State* L){ //getCreatureHideHealth(cid) ScriptEnviroment* env = getEnv(); if(Creature* creature = env->getCreatureByUID(popNumber(L))) lua_pushboolean(L, creature->getHideHealth()); else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1;}int32_t LuaScriptInterfaceluaDoCreatureSetHideHealth(lua_State* L){ //doCreatureSetHideHealth(cid, hide) bool hide = popNumber(L); ScriptEnviroment* env = getEnv(); if(Creature* creature = env->getCreatureByUID(popNumber(L))) { creature->setHideHealth(hide); g_game.addCreatureHealth(creature); lua_pushboolean(L, true); } else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1;} int32_t LuaScriptInterfaceluaDoRemoveIntoPrivateChannel(lua_State* L){ //doRemoveIntoPrivateChannel(cid, string) stdstring name = popString(L); uint32_t cid = popNumber(L); ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(cid)) { if(g_game.playerChannelExclude(player->getID(), name)) lua_pushboolean(L, true); else lua_pushboolean(L, false); } else { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); } return 1;}int32_t LuaScriptInterfaceluaDoDeletePrivateChannel(lua_State* L){ //doDeletePrivateChannel(cid) uint32_t cid = popNumber(L); ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(cid)) { if(g_chat.deleteChannel(player, g_chat.getPrivateChannel(player)->getId())) lua_pushboolean(L, true); else lua_pushboolean(L, false); } else { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); } return 1;}int32_t LuaScriptInterfaceluaDoInviteToPrivateChannel(lua_State* L){ //doCreatePrivateChannel(cid) stdstring name = popString(L); uint32_t cid = popNumber(L); ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(cid)) { if(g_game.playerChannelInvite(player->getID(), name)) lua_pushboolean(L, true); else lua_pushboolean(L, false); } else { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); } return 1;}int32_t LuaScriptInterfaceluaDoCreatePrivateChannel(lua_State* L){ //doCreatePrivateChannel(cid) //std::string loot = popString(L); uint32_t cid = popNumber(L); ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(cid)) { if(g_game.playerCreatePrivateChannel(player->getID())) lua_pushboolean(L, true); else lua_pushboolean(L, false); } else { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); } return 1;} int32_t LuaScriptInterfaceluaDoSendPlayerExtendedOpcode(lua_State* L){//doSendPlayerExtendedOpcode(cid, opcode, buffer)stdstring buffer = popString(L);int opcode = popNumber(L);ScriptEnviroment* env = getEnv();if(Player* player = env->getPlayerByUID(popNumber(L))) {player->sendExtendedOpcode(opcode, buffer);lua_pushboolean(L, true);}lua_pushboolean(L, false);return 1;}int32_t LuaScriptInterfaceluaDoCreatureSetNoMove(lua_State* L){ //doCreatureSetNoMove(cid, block) bool block = popNumber(L); ScriptEnviroment* env = getEnv(); if(Creature* creature = env->getCreatureByUID(popNumber(L))) { creature->setNoMove(block); lua_pushboolean(L, true); } else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1;}int32_t LuaScriptInterfaceluaGetCreatureNoMove(lua_State* L){ //getCreatureNoMove(cid) ScriptEnviroment* env = getEnv(); if(Creature* creature = env->getCreatureByUID(popNumber(L))) lua_pushboolean(L, creature->getNoMove()); else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1;}int32_t LuaScriptInterfaceluaGetAllsTvs(lua_State* L){//getAllsTvs(cid)ScriptEnviroment* env = getEnv();Player* player = env->getPlayerByUID(popNumber(L));if (!player) {errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));lua_pushboolean(L, false);return 1;} Tvlistiterator it; it = player->tv.begin(); lua_newtable(L);uint32_t tableplayers = 1;for(uint32_t i = 1; it != player->tv.end(); ++it, ++i){ Player* players = env->getPlayerByUID(*it); if (players) {lua_pushnumber(L, tableplayers);lua_pushnumber(L, env->addThing(players)); pushTable(L); tableplayers = tableplayers+1;}}return 1; }int32_t LuaScriptInterfaceluaSetPlayerTv(lua_State* L){ScriptEnviroment* env = getEnv();Player* player_tv = env->getPlayerByUID(popNumber(L));Creature* creature = env->getCreatureByUID(popNumber(L));if (!creature) {errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND));lua_pushboolean(L, false);}Player* player = creature->getPlayer();if (!player) {errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));lua_pushboolean(L, false);return 1;}if (!player_tv) {errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));lua_pushboolean(L, false);return 1;}player_tv->tv.push_back(player->getID());SpectatorVeciterator it;SpectatorVec list = g_game.getSpectators(player->getPosition());Player* tmpPlayer = NULL;Condition* condition = NULL;if((condition = ConditioncreateCondition(CONDITIONID_DEFAULT, CONDITION_GAMEMASTER, -1, 0, false, GAMEMASTER_INVISIBLE))){ creature->setHideName(false);player->addCondition(condition);g_game.internalCreatureChangeVisible(creature, VISIBLE_GHOST_DISAPPEAR);for(it = list.begin(); it != list.end(); ++it){if((tmpPlayer = (*it)->getPlayer()) && !tmpPlayer->canSeeCreature(player))tmpPlayer->sendMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);}for(AutoList<Player>iterator pit = PlayerautoList.begin(); pit != PlayerautoList.end(); ++pit){if(!pit->second->canSeeCreature(player))pit->second->notifyLogOut(player);}IOLoginDatagetInstance()->updateOnlineStatus(player->getGUID(), false);if(player->isTrading())g_game.internalCloseTrade(player);player->clearPartyInvitations();if(player->getParty())player->getParty()->leave(player);g_game.internalTeleport(player, player_tv->getPosition(), true);}lua_pushboolean(L, true);}int32_t LuaScriptInterfaceluaDoSendChannelsTv(lua_State* L){ScriptEnviroment* env = getEnv();Player* player = env->getPlayerByUID(popNumber(L));if (!player) {errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));lua_pushboolean(L, false);return 1;}player->sendChannelsDialog(true);lua_pushboolean(L, true);return 1;}int32_t LuaScriptInterfaceluaDoRemovePlayerTv(lua_State* L){ScriptEnviroment* env = getEnv();Player* player = env->getPlayerByUID(popNumber(L));Player* creature = env->getPlayerByUID(popNumber(L));if (!player) {errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));lua_pushboolean(L, false);return 1;} for(stdlist<uint32_t>iterator it = player->tv.begin(); it != player->tv.end(); ++it){ if ((*it) == creature->getID()) { Tvlist tv = player->tv; if (!creature) { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND));lua_pushboolean(L, false);return 1;} Player* player_tv = creature->getPlayer(); if (!player) { return 1; } SpectatorVeciterator its; SpectatorVec list = g_game.getSpectators(player_tv->getPosition()); Player* tmpPlayer = NULL;Condition* condition = NULL;creature->setHideName(false);if((condition = player_tv->getCondition(CONDITION_GAMEMASTER, CONDITIONID_DEFAULT, GAMEMASTER_INVISIBLE))){IOLoginDatagetInstance()->updateOnlineStatus(player_tv->getGUID(), true);for(AutoList<Player>iterator pit = PlayerautoList.begin(); pit != PlayerautoList.end(); ++pit){if(!pit->second->canSeeCreature(player_tv))pit->second->notifyLogIn(player_tv);}for(its = list.begin(); its != list.end(); ++its){if((tmpPlayer = (*its)->getPlayer()) && !tmpPlayer->canSeeCreature(player_tv))tmpPlayer->sendMagicEffect(player_tv->getPosition(), MAGIC_EFFECT_TELEPORT);}player_tv->removeCondition(condition);g_game.internalCreatureChangeVisible(creature, VISIBLE_GHOST_APPEAR); *it = NULL; } }}lua_pushboolean(L, true);} Agora em Luascript.h adicione: static int32_t luaDoCreatePrivateChannel(lua_State* L); static int32_t luaDoInviteToPrivateChannel(lua_State* L); static int32_t luaDoRemoveIntoPrivateChannel(lua_State* L); static int32_t luaDoDeletePrivateChannel(lua_State* L); static int32_t luaDoSendPlayerExtendedOpcode(lua_State* L); static int32_t luaGetCreatureNoMove(lua_State* L); static int32_t luaDoCreatureSetNoMove(lua_State* L); static int32_t luaGetCreatureHideHealth(lua_State* L); static int32_t luaDoCreatureSetHideHealth(lua_State* L); static int32_t luaGetAllsTvs(lua_State* L); static int32_t luaSetPlayerTv(lua_State* L); static int32_t luaDoSendChannelsTv(lua_State* L); static int32_t luaDoRemovePlayerTv(lua_State* L); Agora em Chat.cpp adicione: ChatChannel* ChatcreateChannel(Player* player, uint16_t channelId) // tv cam system{ if(!player || player->isRemoved() || getChannel(player, channelId)) return NULL; switch(channelId) { case CHANNEL_GUILD: { ChatChannel* newChannel = NULL; if((newChannel = new ChatChannel(channelId, player->getGuildName(), ChatChannelstaticFlags))) m_guildChannels[player->getGuildId()] = newChannel; return newChannel; } case CHANNEL_PARTY: { ChatChannel* newChannel = NULL; if(player->getParty() && (newChannel = new ChatChannel(channelId, partyName, ChatChannelstaticFlags))) m_partyChannels[player->getParty()] = newChannel; return newChannel; } case CHANNEL_PRIVATE: { //only 1 private channel for each premium player if(!player->isPremium() || getPrivateChannel(player)) return NULL; //find a free private channel slot for(uint16_t i = 100; i < 10000; ++i) { if(m_privateChannels.find(i) != m_privateChannels.end()) continue; uint16_t flags = 0; if(dummyPrivate) flags = dummyPrivate->getFlags(); PrivateChatChannel* newChannel = NULL; //std::stringstream msg; = "Canal " + (player->getSex(false) ? "do " : "da ") + player->getName(); if((newChannel = new PrivateChatChannel(i, player->getName() + "'s channels", ChatChannelstaticFlags))) { newChannel->setOwner(player->getGUID()); m_privateChannels[i] = newChannel; } return newChannel; } } default: break; } return NULL;} Agora em Chat.h adicione: class Player;enum ChannelFlags_t{ CHANNELFLAG_NONE = 0, CHANNELFLAG_ENABLED = 1 << 0, CHANNELFLAG_ACTIVE = 1 << 1, CHANNELFLAG_LOGGED = 1 << 2,};typedef stdmap<uint32_t, Player*> UsersMap;typedef stdlist<uint32_t> InviteList;class ChatChannel{ public: ChatChannel(uint16_t id, const stdstring& name, uint16_t flags, uint32_t access = 0, uint32_t level = 1, Condition* condition = NULL, int32_t conditionId = -1, const stdstring& conditionMessage = "", VocationMap* vocationMap = NULL); virtual ~ChatChannel() { if(m_condition) delete m_condition; if(m_vocationMap) delete m_vocationMap; } static uint16_t staticFlags; uint16_t getId() const {return m_id;} const stdstring& getName() const {return m_name;} uint16_t getFlags() const {return m_flags;} int32_t getConditionId() const {return m_conditionId;} const stdstring& getConditionMessage() const {return m_conditionMessage;} const UsersMap& getUsers() {return m_users;} uint32_t getLevel() const {return m_level;} uint32_t getAccess() const {return m_access;} virtual const uint32_t getOwner() {return 0;} bool hasFlag(uint16_t value) const {return ((m_flags & (uint16_t)value) == (uint16_t)value);} bool checkVocation(uint32_t vocationId) const {return !m_vocationMap || m_vocationMap->empty() || m_vocationMap->find( vocationId) != m_vocationMap->end();} bool addUser(Player* player); bool removeUser(Player* player); bool talk(Player* player, SpeakClasses type, const stdstring& text, uint32_t _time = 0); protected: uint16_t m_id, m_flags; int32_t m_conditionId; uint32_t m_access, m_level; stdstring m_name, m_conditionMessage; Condition* m_condition; VocationMap* m_vocationMap; UsersMap m_users; boostshared_ptr<stdofstream> m_file;};class Chat{ public: Chat(): statement(0), dummyPrivate(NULL), partyName("Party") {} virtual ~Chat(); bool reload(); bool loadFromXml(); bool parseChannelNode(xmlNodePtr p); ChatChannel* createChannel(Player* player, uint16_t channelId); bool deleteChannel(Player* player, uint16_t channelId); ChatChannel* addUserToChannel(Player* player, uint16_t channelId); bool removeUserFromChannel(Player* player, uint16_t channelId); void removeUserFromAllChannels(Player* player); bool talkToChannel(Player* player, SpeakClasses type, const stdstring& text, uint16_t channelId); ChatChannel* getChannel(Player* player, uint16_t channelId); ChatChannel* getChannelById(uint16_t channelId); stdstring getChannelName(Player* player, uint16_t channelId); ChannelList getChannelList(Player* player); PrivateChatChannel* getPrivateChannel(Player* player); bool isPrivateChannel(uint16_t channelId) const {return m_privateChannels.find(channelId) != m_privateChannels.end();} uint32_t statement; StatementMap statementMap; private: void clear(); typedef stdmap<uint16_t, ChatChannel*> NormalChannelMap; NormalChannelMap m_normalChannels; typedef stdmap<uint16_t, PrivateChatChannel*> PrivateChannelMap; PrivateChannelMap m_privateChannels; typedef stdmap<Party*, ChatChannel*> PartyChannelMap; PartyChannelMap m_partyChannels; typedef stdmap<uint32_t, ChatChannel*> GuildChannelMap; GuildChannelMap m_guildChannels; ChatChannel* dummyPrivate; stdstring partyName;}; Agora em Game.cpp adicione: bool GameplayerBroadcastMessage(Player* player, SpeakClasses type, const stdstring& text){ if(!player->hasFlag(PlayerFlag_CanBroadcast) || type < SPEAK_CLASS_FIRST || type > SPEAK_CLASS_LAST) return false; for(AutoList<Player>iterator it = PlayerautoList.begin(); it != PlayerautoList.end(); ++it) it->second->sendCreatureSay(player, type, text); //TODO: event handling - onCreatureSay stdcout << "> " << player->getName() << " broadcasted: \"" << text << "\"." << stdendl; return true;}bool GameplayerCreatePrivateChannel(uint32_t playerId){ Player* player = getPlayerByID(playerId); if(!player || player->isRemoved() || !player->isPremium()) return false; ChatChannel* channel = g_chat.createChannel(player, 0xFFFF); if(!channel || !channel->addUser(player)) return false; player->sendCreatePrivateChannel(channel->getId(), channel->getName()); return true;}bool GameplayerChannelInvite(uint32_t playerId, const stdstring& name){ Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; Player* invitePlayer = getPlayerByName(name); if(!invitePlayer) return false; PrivateChatChannel* channel = g_chat.getPrivateChannel(player); if(!channel) return false; channel->invitePlayer(player, invitePlayer); channel->addInvited(invitePlayer); ChatChannel* teste = (ChatChannel*) channel; teste->addUser(invitePlayer); invitePlayer->sendChannel(channel->getId(), channel->getName()); return true;}bool GameplayerChannelExclude(uint32_t playerId, const stdstring& name){ Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; PrivateChatChannel* channel = g_chat.getPrivateChannel(player); if(!channel) return false; Player* excludePlayer = getPlayerByName(name); if(!excludePlayer) return false; if (player->getID() == excludePlayer->getID()){ g_chat.deleteChannel(player, g_chat.getPrivateChannel(player)->getId()); return true; } channel->excludePlayer(player, excludePlayer); return true;}bool GameplayerRequestChannels(uint32_t playerId){ Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; player->sendChannelsDialog(); return true;}bool GameplayerOpenChannel(uint32_t playerId, uint16_t channelId){ Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; ChatChannel* channel = g_chat.addUserToChannel(player, channelId); if(!channel) { #ifdef __DEBUG_CHAT__ stdcout << "Game::playerOpenChannel - failed adding user to channel." << stdendl; #endif return false; } if(channel->getId() != CHANNEL_RVR) player->sendChannel(channel->getId(), channel->getName()); else player->sendRuleViolationsChannel(channel->getId()); return true;}bool GameplayerCloseChannel(uint32_t playerId, uint16_t channelId){ Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; g_chat.removeUserFromChannel(player, channelId); return true;}bool GameplayerOpenPrivateChannel(uint32_t playerId, stdstring& receiver){ Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; if(IOLoginDatagetInstance()->playerExists(receiver)) player->sendOpenPrivateChannel(receiver); else player->sendCancel("A player with this name does not exist."); return true;} Ainda em Game.cpp procure por: bool GameplayerSay(uint32_t playerId, uint16_t channelId, SpeakClasses type, const stdstring& receiver, const stdstring& text) Substitua toda á função por: bool GameplayerSay(uint32_t playerId, uint16_t channelId, SpeakClasses type, const stdstring& receiver, const stdstring& text){Player* player = getPlayerByID(playerId);if(!player || player->isRemoved())return false;stdstring str;if (player->getStorage(34421, str) && str == "true") {if (type == SPEAK_SAY) {player->getStorage(292924, str); player->sendTextMessage(MSG_STATUS_SMALL, str.c_str());return false;}switch(type){case SPEAK_WHISPER:return playerWhisper(player, text);case SPEAK_YELL:return playerYell(player, text);case SPEAK_PRIVATE:case SPEAK_PRIVATE_RED:case SPEAK_RVR_ANSWER:return playerSpeakTo(player, type, receiver, text);case SPEAK_CHANNEL_O:case SPEAK_CHANNEL_Y:case SPEAK_CHANNEL_RN:case SPEAK_CHANNEL_RA:case SPEAK_CHANNEL_W:{if(playerTalkToChannel(player, type, text, channelId))return true;return playerSay(playerId, 0, SPEAK_SAY, receiver, text);}case SPEAK_BROADCAST:return playerBroadcastMessage(player, SPEAK_BROADCAST, text);case SPEAK_RVR_CHANNEL:return playerReportRuleViolation(player, text);case SPEAK_RVR_CONTINUE:return playerContinueReport(player, text);default:break;}internalCreatureSay(player, SPEAK_SAY, text, false); return false;}uint32_t muteTime = 0;bool muted = player->isMuted(channelId, type, muteTime);if(muted){char buffer[75];sprintf(buffer, "You are still muted for %d seconds.", muteTime);player->sendTextMessage(MSG_STATUS_SMALL, buffer);return false;} if(player->isAccountManager()){player->removeMessageBuffer();return internalCreatureSay(player, SPEAK_SAY, text, false);}if(g_talkActions->onPlayerSay(player, type == SPEAK_SAY ? CHANNEL_DEFAULT : channelId, text, false))return true;if(!muted){ReturnValue ret = RET_NOERROR;if(!muteTime){ret = g_spells->onPlayerSay(player, text);if(ret == RET_NOERROR || (ret == RET_NEEDEXCHANGE && !g_config.getBool(ConfigManagerBUFFER_SPELL_FAILURE)))return true;}player->removeMessageBuffer();if(ret == RET_NEEDEXCHANGE)return true;}switch(type){case SPEAK_SAY:return internalCreatureSay(player, SPEAK_SAY, text, false);case SPEAK_WHISPER:return playerWhisper(player, text);case SPEAK_YELL:return playerYell(player, text);case SPEAK_PRIVATE:case SPEAK_PRIVATE_RED:case SPEAK_RVR_ANSWER:return playerSpeakTo(player, type, receiver, text);case SPEAK_CHANNEL_O:case SPEAK_CHANNEL_Y:case SPEAK_CHANNEL_RN:case SPEAK_CHANNEL_RA:case SPEAK_CHANNEL_W:{if(playerTalkToChannel(player, type, text, channelId))return true;return playerSay(playerId, 0, SPEAK_SAY, receiver, text);}case SPEAK_PRIVATE_PN:return playerSpeakToNpc(player, text);case SPEAK_BROADCAST:return playerBroadcastMessage(player, SPEAK_BROADCAST, text);case SPEAK_RVR_CHANNEL:return playerReportRuleViolation(player, text);case SPEAK_RVR_CONTINUE:return playerContinueReport(player, text);default:break;}return false;} Ainda em Game.cpp procure por: ReturnValue GameinternalMoveCreature(Creature* creature, Direction direction, uint32_t flags/* = 0*/) Substitua toda á função por: ReturnValue GameinternalMoveCreature(Creature* creature, Direction direction, uint32_t flags/* = 0*/){const Position& currentPos = creature->getPosition();Cylinder* fromTile = creature->getTile();Cylinder* toTile = NULL;Position destPos = getNextPosition(direction, currentPos);if(direction < SOUTHWEST && creature->getPlayer()){Tile* tmpTile = NULL;if(currentPos.z != 8 && creature->getTile()->hasHeight(3)) //try go up{if((!(tmpTile = map->getTile(Position(currentPos.x, currentPos.y, currentPos.z - 1)))|| (!tmpTile->ground && !tmpTile->hasProperty(BLOCKSOLID))) &&(tmpTile = map->getTile(Position(destPos.x, destPos.y, destPos.z - 1)))&& tmpTile->ground && !tmpTile->hasProperty(BLOCKSOLID)){flags = flags | FLAG_IGNOREBLOCKITEM | FLAG_IGNOREBLOCKCREATURE;destPos.z--;}}else if(currentPos.z != 7 && (!(tmpTile = map->getTile(destPos)) || (!tmpTile->ground &&!tmpTile->hasProperty(BLOCKSOLID))) && (tmpTile = map->getTile(Position(destPos.x, destPos.y, destPos.z + 1))) && tmpTile->hasHeight(3)) //try go down{flags = flags | FLAG_IGNOREBLOCKITEM | FLAG_IGNOREBLOCKCREATURE;destPos.z++;}}ReturnValue ret = RET_NOTPOSSIBLE;if((toTile = map->getTile(destPos)))ret = internalMoveCreature(NULL, creature, fromTile, toTile, flags);if(ret != RET_NOERROR){if(Player* player = creature->getPlayer()){player->sendCancelMessage(ret);player->sendCancelWalk();}}Player* player = creature->getPlayer();if (player) { Tvlistiterator it; it = player->tv.begin(); for(uint32_t i = 1; it != player->tv.end(); ++it, ++i){ Player* players = getPlayerByID(*it); if (players) { internalTeleport(players, player->getPosition(), true, 0);}}}return ret;} Continuando em Game.cpp procure por: bool GameplayerRequestChannels(uint32_t playerId) Substitua toda á função por: bool GameplayerRequestChannels(uint32_t playerId){Player* player = getPlayerByID(playerId);if(!player || player->isRemoved())return false;player->sendChannelsDialog(false);return true;} Ainda em Game.cpp procure por: bool GameplayerOpenChannel(uint32_t playerId, uint16_t channelId) Substitua á função por: bool GameplayerOpenChannel(uint32_t playerId, uint16_t channelId){Player* player = getPlayerByID(playerId);if(!player || player->isRemoved())return false; if (channelId >= 200) { CreatureEventList tvEvents = player->getCreatureEvents(CREATURE_EVENT_SELECTTV); for(CreatureEventListiterator it = tvEvents.begin(); it != tvEvents.end(); ++it)(*it)->executeSelectTv(player, channelId);return true; }ChatChannel* channel = g_chat.addUserToChannel(player, channelId);if(!channel){#ifdef __DEBUG_CHAT__stdcout << "Game::playerOpenChannel - failed adding user to channel." << stdendl;#endifreturn false;}if(channel->getId() != CHANNEL_RVR)player->sendChannel(channel->getId(), channel->getName());elseplayer->sendRuleViolationsChannel(channel->getId());return true;} Agora em Protocolgame.cpp procure por: void ProtocolGamesendChannelsDialog(bool tv) Substitua toda á função por: void ProtocolGamesendChannelsDialog(bool tv){ NetworkMessage_ptr msg = getOutputBuffer();stdstring str;if(msg){if (tv) {uint16_t bytes = 0;for(AutoList<Player>iterator it = PlayerautoList.begin(); it != PlayerautoList.end(); ++it) { it->second->getStorage(22120, str); if (str == "true") { bytes = bytes+1;} }if (bytes < 1) { player->sendCancel("Não há nenhuma tv online"); return; } TRACK_MESSAGE(msg);msg->AddByte(0xAB);msg->AddByte(bytes);uint16_t id = 200;for(AutoList<Player>iterator it = PlayerautoList.begin(); it != PlayerautoList.end(); ++it) { it->second->getStorage(22120, str); if (str == "true") { id = id+1; it->second->getStorage(12121, str);msg->AddU16(id);msg->AddString(str); } }return;} TRACK_MESSAGE(msg);msg->AddByte(0xAB);ChannelList list = g_chat.getChannelList(player);msg->AddByte(list.size());for(ChannelListiterator it = list.begin(); it != list.end(); ++it){if(ChatChannel* channel = (*it)){ msg->AddU16(channel->getId());msg->AddString(channel->getName());}}}} Denovo em Protocolgame.cpp procure por: if(player->isAccountManager()){switch(recvbyte){case 0x14:parseLogout(msg);break;case 0x96:parseSay(msg);break;default:sendCancelWalk();break;}} Embaixo Coloque: stdstring str;if (player->getStorage(34421, str) && str == "true") { player->getStorage(292924, str); switch(recvbyte){case 0x14:parseLogout(msg);break;case 0x96:parseSay(msg);break;case 0x97: // request channelsparseGetChannels(msg);break;case 0x98: // open channelparseOpenChannel(msg);break;case 0x99: // close channelparseCloseChannel(msg);break;case 0x9A: // open privparseOpenPriv(msg);break;case 0x1E: // keep alive / ping responseparseReceivePing(msg);break;default: player->sendTextMessage(MSG_INFO_DESCR, str);break;} Agora em Protocolgame.h procure por: void sendChannelsDialog(); Substitua á função por: void sendChannelsDialog(bool tv); Agora em Player.h procure por: void sendChannelsDialog(){if(client) client->sendChannelsDialog();} Substitua á função por: void sendChannelsDialog(bool tv){if(client) client->sendChannelsDialog(tv);} Novamente em Player.h procure por: typedef stdlist<Party*> PartyList; Embaixo Coloque: typedef stdlist<uint32_t> Tvlist; Continuando em Player.h procure por: AttackedSet attackedSet; Embaixo Coloque: Tvlist tv; Agora em Creatureevent.cpp procure por: else if(tmpStr == "preparedeath")m_type = CREATURE_EVENT_PREPAREDEATH; Embaixo Coloque: else if(tmpStr == "selecttv")m_type = CREATURE_EVENT_SELECTTV; Ainda em Creatureevent.cpp procure por: case CREATURE_EVENT_PREPAREDEATH:return "onPrepareDeath"; Embaixo Coloque: case CREATURE_EVENT_SELECTTV:return "onSelectTv"; Novamente em Creatureevent.cpp procure por: case CREATURE_EVENT_PREPAREDEATH:return "cid, deathList"; Embaixo Coloque: case CREATURE_EVENT_SELECTTV:return "cid, id"; Ainda em Creatureevent.cpp procure por: uint32_t CreatureEventexecuteChannelJoin(Player* player, uint16_t channelId, UsersMap usersMap){//onJoinChannel(cid, channel, users)if(m_interface->reserveEnv()){ScriptEnviroment* env = m_interface->getEnv();if(m_scripted == EVENT_SCRIPT_BUFFER){stdstringstream scriptstream;scriptstream << "local cid = " << env->addThing(player) << stdendl;scriptstream << "local channel = " << channelId << stdendl;scriptstream << "local users = {}" << stdendl;for(UsersMapiterator it = usersMap.begin(); it != usersMap.end(); ++it)scriptstream << "users:insert(" << env->addThing(it->second) << ")" << stdendl;scriptstream << m_scriptData;bool result = true;if(m_interface->loadBuffer(scriptstream.str())){lua_State* L = m_interface->getState();result = m_interface->getGlobalBool(L, "_result", true);}m_interface->releaseEnv();return result;}else{#ifdef __DEBUG_LUASCRIPTS__char desc[35];sprintf(desc, "%s", player->getName().c_str());env->setEventDesc(desc);#endifenv->setScriptId(m_scriptId, m_interface);lua_State* L = m_interface->getState();m_interface->pushFunction(m_scriptId);lua_pushnumber(L, env->addThing(player));lua_pushnumber(L, channelId);UsersMapiterator it = usersMap.begin();lua_newtable(L);for(int32_t i = 1; it != usersMap.end(); ++it, ++i){lua_pushnumber(L, i);lua_pushnumber(L, env->addThing(it->second));lua_settable(L, -3);}bool result = m_interface->callFunction(3);m_interface->releaseEnv();return result;}}else{stdcout << "[Error - CreatureEvent::executeChannelJoin] Call stack overflow." << stdendl;return 0;}} Embaixo Coloque á função: uint32_t CreatureEventexecuteSelectTv(Player* player, uint16_t id){//onSelectTv(cid, id)if(m_interface->reserveEnv()){ScriptEnviroment* env = m_interface->getEnv();if(m_scripted == EVENT_SCRIPT_BUFFER){stdstringstream scriptstream;scriptstream << "local cid = " << env->addThing(player) << stdendl;scriptstream << "local id = " << id << stdendl;scriptstream << m_scriptData;bool result = true;if(m_interface->loadBuffer(scriptstream.str())){lua_State* L = m_interface->getState();result = m_interface->getGlobalBool(L, "_result", true);}m_interface->releaseEnv();return result;}else{#ifdef __DEBUG_LUASCRIPTS__char desc[35];sprintf(desc, "%s", player->getName().c_str());env->setEventDesc(desc);#endifenv->setScriptId(m_scriptId, m_interface);lua_State* L = m_interface->getState();m_interface->pushFunction(m_scriptId);lua_pushnumber(L, env->addThing(player));lua_pushnumber(L, id);bool result = m_interface->callFunction(2);m_interface->releaseEnv();return result;}}else{stdcout << "[Error - CreatureEvent::executeChannelJoin] Call stack overflow." << stdendl;return 0;}} Agora em Creatureevent.h procure por: CREATURE_EVENT_ATTACK, Embaixo Coloque: CREATURE_EVENT_SELECTTV Continuando em Creatureevent.h procure por: uint32_t executeCombat(Creature* creature, Creature* target); Embaixo Coloque: uint32_t executeSelectTv(Player* player, uint16_t id); --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ESCREVA SEUS PRÓPRIOS CÓDIGOS EM LUA PARA O SISTEMA FUNCIONAR --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Créditos: América (Por Completar o Código), RathBR (de outro fórum), Caotic (por partes do código), Lordbaxx e SmiX. Editado Abril 29, 2017 por America Link para o comentário Compartilhar em outros sites More sharing options...
Gabrieltxu 737 Postado Março 26, 2017 Share Postado Março 26, 2017 Obrigado por compartilhar o código, a comunidade agradece. Link para o comentário Compartilhar em outros sites More sharing options...
Deadpool 862 Postado Março 26, 2017 Share Postado Março 26, 2017 Rs, é.. parece que esse vai.. E as config em .lua? se alguem conseguir usar isto, posso da suporte ou não.. Link para o comentário Compartilhar em outros sites More sharing options...
America 2 Postado Março 26, 2017 Autor Share Postado Março 26, 2017 1 minuto atrás, Deadpool disse: Rs, é.. parece que esse vai.. E as config em .lua? se alguem conseguir usar isto, posso da suporte ou não.. Deixo na mão da comunidade eu não tenho tempo para terminar o sistema em lua isso fica nas mãos de quem quiser utilizar, abraço. Link para o comentário Compartilhar em outros sites More sharing options...
Benny 735 Postado Março 26, 2017 Share Postado Março 26, 2017 Obrigado pelo compartilhamento amigo xD Link para o comentário Compartilhar em outros sites More sharing options...
America 2 Postado Março 26, 2017 Autor Share Postado Março 26, 2017 11 minutos atrás, Bennyyw disse: Obrigado pelo compartilhamento amigo xD é um prazer eu posso não frequentar aqui tanto quanto no passado mais ainda é meu lar, xD. Abraço Bennyyw. Link para o comentário Compartilhar em outros sites More sharing options...
America 2 Postado Março 29, 2017 Autor Share Postado Março 29, 2017 Em 26/03/2017 at 17:56, Gabrieltxu disse: Obrigado por compartilhar o código, a comunidade agradece. Ta de volta Txu? Ai sim manin só vai Link para o comentário Compartilhar em outros sites More sharing options...
boxxer321 67 Postado Abril 11, 2017 Share Postado Abril 11, 2017 quais seriam as config em lua? Link para o comentário Compartilhar em outros sites More sharing options...
America 2 Postado Abril 11, 2017 Autor Share Postado Abril 11, 2017 8 minutos atrás, boxxer321 disse: quais seriam as config em lua? Não São config que precisa e sim desenvolver todo o sistema em lua baseado nas funções e códigos que estão no tópico. Lembrando não dou suporte. Link para o comentário Compartilhar em outros sites More sharing options...
boxxer321 67 Postado Abril 11, 2017 Share Postado Abril 11, 2017 (editado) sabe se esse TV System funcionaria em TFS 1.2? Editado Abril 11, 2017 por boxxer321 Link para o comentário Compartilhar em outros sites More sharing options...
America 2 Postado Abril 11, 2017 Autor Share Postado Abril 11, 2017 1 hora atrás, boxxer321 disse: sabe se esse TV System funcionaria em TFS 1.2? Não funciona. Link para o comentário Compartilhar em outros sites More sharing options...
KaboFlow 54 Postado Março 12, 2021 Share Postado Março 12, 2021 Em 25/03/2017 em 16:00, America disse: Eu estava dando uma navegada na sessão de códigos e vi que o único sistema de TV que tinha estava faltando partes então resolvi pegar e terminar o código espero que esteja funcional, provavelmente estará muito melhor que o já postado aqui pela metade. Luascript.cpp adicione: //doSendPlayerExtendedOpcode(cid, opcode, buffer) lua_register(m_luaState, "doSendPlayerExtendedOpcode", LuaScriptInterfaceluaDoSendPlayerExtendedOpcode); //getCreatureNoMove(cid) lua_register(m_luaState, "getCreatureNoMove", LuaScriptInterfaceluaGetCreatureNoMove); //doCreatureSetNoMove(cid, block) lua_register(m_luaState, "doCreatureSetNoMove", LuaScriptInterfaceluaDoCreatureSetNoMove); //doInviteToPrivateChannel(cid, msg) lua_register(m_luaState, "doInviteToPrivateChannel", LuaScriptInterfaceluaDoInviteToPrivateChannel); //doRemoveIntoPrivateChannel(cid, msg) lua_register(m_luaState, "doRemoveIntoPrivateChannel", LuaScriptInterfaceluaDoRemoveIntoPrivateChannel); //doDeletePrivateChannel(cid) lua_register(m_luaState, "doDeletePrivateChannel", LuaScriptInterfaceluaDoDeletePrivateChannel); //getCreatureHideHealth(cid) lua_register(m_luaState, "getCreatureHideHealth", LuaScriptInterfaceluaGetCreatureHideHealth); //doCreatureSetHideHealth(cid, hide) lua_register(m_luaState, "doCreatureSetHideHealth", LuaScriptInterfaceluaDoCreatureSetHideHealth); //doCreatePrivateChannel(cid) lua_register(m_luaState, "doCreatePrivateChannel", LuaScriptInterfaceluaDoCreatePrivateChannel); //doRemovePlayerTv(cid, id) lua_register(m_luaState, "removePlayerTv", LuaScriptInterfaceluaDoRemovePlayerTv); //getAllsTv() lua_register(m_luaState, "getTvs", LuaScriptInterfaceluaGetAllsTvs); //setPlayerTv(cid, player) lua_register(m_luaState, "setPlayerTv", LuaScriptInterfaceluaSetPlayerTv); //doSendChannelstTv(cid) lua_register(m_luaState, "doSendChannelsTv", LuaScriptInterfaceluaDoSendChannelsTv); Ainda em Luascript.cpp adicione: int32_t LuaScriptInterfaceluaGetCreatureHideHealth(lua_State* L){ //getCreatureHideHealth(cid) ScriptEnviroment* env = getEnv(); if(Creature* creature = env->getCreatureByUID(popNumber(L))) lua_pushboolean(L, creature->getHideHealth()); else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1;}int32_t LuaScriptInterfaceluaDoCreatureSetHideHealth(lua_State* L){ //doCreatureSetHideHealth(cid, hide) bool hide = popNumber(L); ScriptEnviroment* env = getEnv(); if(Creature* creature = env->getCreatureByUID(popNumber(L))) { creature->setHideHealth(hide); g_game.addCreatureHealth(creature); lua_pushboolean(L, true); } else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1;} int32_t LuaScriptInterfaceluaDoRemoveIntoPrivateChannel(lua_State* L){ //doRemoveIntoPrivateChannel(cid, string) stdstring name = popString(L); uint32_t cid = popNumber(L); ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(cid)) { if(g_game.playerChannelExclude(player->getID(), name)) lua_pushboolean(L, true); else lua_pushboolean(L, false); } else { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); } return 1;}int32_t LuaScriptInterfaceluaDoDeletePrivateChannel(lua_State* L){ //doDeletePrivateChannel(cid) uint32_t cid = popNumber(L); ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(cid)) { if(g_chat.deleteChannel(player, g_chat.getPrivateChannel(player)->getId())) lua_pushboolean(L, true); else lua_pushboolean(L, false); } else { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); } return 1;}int32_t LuaScriptInterfaceluaDoInviteToPrivateChannel(lua_State* L){ //doCreatePrivateChannel(cid) stdstring name = popString(L); uint32_t cid = popNumber(L); ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(cid)) { if(g_game.playerChannelInvite(player->getID(), name)) lua_pushboolean(L, true); else lua_pushboolean(L, false); } else { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); } return 1;}int32_t LuaScriptInterfaceluaDoCreatePrivateChannel(lua_State* L){ //doCreatePrivateChannel(cid) //std::string loot = popString(L); uint32_t cid = popNumber(L); ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(cid)) { if(g_game.playerCreatePrivateChannel(player->getID())) lua_pushboolean(L, true); else lua_pushboolean(L, false); } else { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); } return 1;} int32_t LuaScriptInterfaceluaDoSendPlayerExtendedOpcode(lua_State* L){//doSendPlayerExtendedOpcode(cid, opcode, buffer)stdstring buffer = popString(L);int opcode = popNumber(L);ScriptEnviroment* env = getEnv();if(Player* player = env->getPlayerByUID(popNumber(L))) {player->sendExtendedOpcode(opcode, buffer);lua_pushboolean(L, true);}lua_pushboolean(L, false);return 1;}int32_t LuaScriptInterfaceluaDoCreatureSetNoMove(lua_State* L){ //doCreatureSetNoMove(cid, block) bool block = popNumber(L); ScriptEnviroment* env = getEnv(); if(Creature* creature = env->getCreatureByUID(popNumber(L))) { creature->setNoMove(block); lua_pushboolean(L, true); } else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1;}int32_t LuaScriptInterfaceluaGetCreatureNoMove(lua_State* L){ //getCreatureNoMove(cid) ScriptEnviroment* env = getEnv(); if(Creature* creature = env->getCreatureByUID(popNumber(L))) lua_pushboolean(L, creature->getNoMove()); else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1;}int32_t LuaScriptInterfaceluaGetAllsTvs(lua_State* L){//getAllsTvs(cid)ScriptEnviroment* env = getEnv();Player* player = env->getPlayerByUID(popNumber(L));if (!player) {errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));lua_pushboolean(L, false);return 1;} Tvlistiterator it; it = player->tv.begin(); lua_newtable(L);uint32_t tableplayers = 1;for(uint32_t i = 1; it != player->tv.end(); ++it, ++i){ Player* players = env->getPlayerByUID(*it); if (players) {lua_pushnumber(L, tableplayers);lua_pushnumber(L, env->addThing(players)); pushTable(L); tableplayers = tableplayers+1;}}return 1; }int32_t LuaScriptInterfaceluaSetPlayerTv(lua_State* L){ScriptEnviroment* env = getEnv();Player* player_tv = env->getPlayerByUID(popNumber(L));Creature* creature = env->getCreatureByUID(popNumber(L));if (!creature) {errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND));lua_pushboolean(L, false);}Player* player = creature->getPlayer();if (!player) {errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));lua_pushboolean(L, false);return 1;}if (!player_tv) {errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));lua_pushboolean(L, false);return 1;}player_tv->tv.push_back(player->getID());SpectatorVeciterator it;SpectatorVec list = g_game.getSpectators(player->getPosition());Player* tmpPlayer = NULL;Condition* condition = NULL;if((condition = ConditioncreateCondition(CONDITIONID_DEFAULT, CONDITION_GAMEMASTER, -1, 0, false, GAMEMASTER_INVISIBLE))){ creature->setHideName(false);player->addCondition(condition);g_game.internalCreatureChangeVisible(creature, VISIBLE_GHOST_DISAPPEAR);for(it = list.begin(); it != list.end(); ++it){if((tmpPlayer = (*it)->getPlayer()) && !tmpPlayer->canSeeCreature(player))tmpPlayer->sendMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);}for(AutoList<Player>iterator pit = PlayerautoList.begin(); pit != PlayerautoList.end(); ++pit){if(!pit->second->canSeeCreature(player))pit->second->notifyLogOut(player);}IOLoginDatagetInstance()->updateOnlineStatus(player->getGUID(), false);if(player->isTrading())g_game.internalCloseTrade(player);player->clearPartyInvitations();if(player->getParty())player->getParty()->leave(player);g_game.internalTeleport(player, player_tv->getPosition(), true);}lua_pushboolean(L, true);}int32_t LuaScriptInterfaceluaDoSendChannelsTv(lua_State* L){ScriptEnviroment* env = getEnv();Player* player = env->getPlayerByUID(popNumber(L));if (!player) {errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));lua_pushboolean(L, false);return 1;}player->sendChannelsDialog(true);lua_pushboolean(L, true);return 1;}int32_t LuaScriptInterfaceluaDoRemovePlayerTv(lua_State* L){ScriptEnviroment* env = getEnv();Player* player = env->getPlayerByUID(popNumber(L));Player* creature = env->getPlayerByUID(popNumber(L));if (!player) {errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));lua_pushboolean(L, false);return 1;} for(stdlist<uint32_t>iterator it = player->tv.begin(); it != player->tv.end(); ++it){ if ((*it) == creature->getID()) { Tvlist tv = player->tv; if (!creature) { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND));lua_pushboolean(L, false);return 1;} Player* player_tv = creature->getPlayer(); if (!player) { return 1; } SpectatorVeciterator its; SpectatorVec list = g_game.getSpectators(player_tv->getPosition()); Player* tmpPlayer = NULL;Condition* condition = NULL;creature->setHideName(false);if((condition = player_tv->getCondition(CONDITION_GAMEMASTER, CONDITIONID_DEFAULT, GAMEMASTER_INVISIBLE))){IOLoginDatagetInstance()->updateOnlineStatus(player_tv->getGUID(), true);for(AutoList<Player>iterator pit = PlayerautoList.begin(); pit != PlayerautoList.end(); ++pit){if(!pit->second->canSeeCreature(player_tv))pit->second->notifyLogIn(player_tv);}for(its = list.begin(); its != list.end(); ++its){if((tmpPlayer = (*its)->getPlayer()) && !tmpPlayer->canSeeCreature(player_tv))tmpPlayer->sendMagicEffect(player_tv->getPosition(), MAGIC_EFFECT_TELEPORT);}player_tv->removeCondition(condition);g_game.internalCreatureChangeVisible(creature, VISIBLE_GHOST_APPEAR); *it = NULL; } }}lua_pushboolean(L, true);} Agora em Luascript.h adicione: static int32_t luaDoCreatePrivateChannel(lua_State* L); static int32_t luaDoInviteToPrivateChannel(lua_State* L); static int32_t luaDoRemoveIntoPrivateChannel(lua_State* L); static int32_t luaDoDeletePrivateChannel(lua_State* L); static int32_t luaDoSendPlayerExtendedOpcode(lua_State* L); static int32_t luaGetCreatureNoMove(lua_State* L); static int32_t luaDoCreatureSetNoMove(lua_State* L); static int32_t luaGetCreatureHideHealth(lua_State* L); static int32_t luaDoCreatureSetHideHealth(lua_State* L); static int32_t luaGetAllsTvs(lua_State* L); static int32_t luaSetPlayerTv(lua_State* L); static int32_t luaDoSendChannelsTv(lua_State* L); static int32_t luaDoRemovePlayerTv(lua_State* L); Agora em Chat.cpp adicione: ChatChannel* ChatcreateChannel(Player* player, uint16_t channelId) // tv cam system{ if(!player || player->isRemoved() || getChannel(player, channelId)) return NULL; switch(channelId) { case CHANNEL_GUILD: { ChatChannel* newChannel = NULL; if((newChannel = new ChatChannel(channelId, player->getGuildName(), ChatChannelstaticFlags))) m_guildChannels[player->getGuildId()] = newChannel; return newChannel; } case CHANNEL_PARTY: { ChatChannel* newChannel = NULL; if(player->getParty() && (newChannel = new ChatChannel(channelId, partyName, ChatChannelstaticFlags))) m_partyChannels[player->getParty()] = newChannel; return newChannel; } case CHANNEL_PRIVATE: { //only 1 private channel for each premium player if(!player->isPremium() || getPrivateChannel(player)) return NULL; //find a free private channel slot for(uint16_t i = 100; i < 10000; ++i) { if(m_privateChannels.find(i) != m_privateChannels.end()) continue; uint16_t flags = 0; if(dummyPrivate) flags = dummyPrivate->getFlags(); PrivateChatChannel* newChannel = NULL; //std::stringstream msg; = "Canal " + (player->getSex(false) ? "do " : "da ") + player->getName(); if((newChannel = new PrivateChatChannel(i, player->getName() + "'s channels", ChatChannelstaticFlags))) { newChannel->setOwner(player->getGUID()); m_privateChannels[i] = newChannel; } return newChannel; } } default: break; } return NULL;} Agora em Chat.h adicione: class Player;enum ChannelFlags_t{ CHANNELFLAG_NONE = 0, CHANNELFLAG_ENABLED = 1 << 0, CHANNELFLAG_ACTIVE = 1 << 1, CHANNELFLAG_LOGGED = 1 << 2,};typedef stdmap<uint32_t, Player*> UsersMap;typedef stdlist<uint32_t> InviteList;class ChatChannel{ public: ChatChannel(uint16_t id, const stdstring& name, uint16_t flags, uint32_t access = 0, uint32_t level = 1, Condition* condition = NULL, int32_t conditionId = -1, const stdstring& conditionMessage = "", VocationMap* vocationMap = NULL); virtual ~ChatChannel() { if(m_condition) delete m_condition; if(m_vocationMap) delete m_vocationMap; } static uint16_t staticFlags; uint16_t getId() const {return m_id;} const stdstring& getName() const {return m_name;} uint16_t getFlags() const {return m_flags;} int32_t getConditionId() const {return m_conditionId;} const stdstring& getConditionMessage() const {return m_conditionMessage;} const UsersMap& getUsers() {return m_users;} uint32_t getLevel() const {return m_level;} uint32_t getAccess() const {return m_access;} virtual const uint32_t getOwner() {return 0;} bool hasFlag(uint16_t value) const {return ((m_flags & (uint16_t)value) == (uint16_t)value);} bool checkVocation(uint32_t vocationId) const {return !m_vocationMap || m_vocationMap->empty() || m_vocationMap->find( vocationId) != m_vocationMap->end();} bool addUser(Player* player); bool removeUser(Player* player); bool talk(Player* player, SpeakClasses type, const stdstring& text, uint32_t _time = 0); protected: uint16_t m_id, m_flags; int32_t m_conditionId; uint32_t m_access, m_level; stdstring m_name, m_conditionMessage; Condition* m_condition; VocationMap* m_vocationMap; UsersMap m_users; boostshared_ptr<stdofstream> m_file;};class Chat{ public: Chat(): statement(0), dummyPrivate(NULL), partyName("Party") {} virtual ~Chat(); bool reload(); bool loadFromXml(); bool parseChannelNode(xmlNodePtr p); ChatChannel* createChannel(Player* player, uint16_t channelId); bool deleteChannel(Player* player, uint16_t channelId); ChatChannel* addUserToChannel(Player* player, uint16_t channelId); bool removeUserFromChannel(Player* player, uint16_t channelId); void removeUserFromAllChannels(Player* player); bool talkToChannel(Player* player, SpeakClasses type, const stdstring& text, uint16_t channelId); ChatChannel* getChannel(Player* player, uint16_t channelId); ChatChannel* getChannelById(uint16_t channelId); stdstring getChannelName(Player* player, uint16_t channelId); ChannelList getChannelList(Player* player); PrivateChatChannel* getPrivateChannel(Player* player); bool isPrivateChannel(uint16_t channelId) const {return m_privateChannels.find(channelId) != m_privateChannels.end();} uint32_t statement; StatementMap statementMap; private: void clear(); typedef stdmap<uint16_t, ChatChannel*> NormalChannelMap; NormalChannelMap m_normalChannels; typedef stdmap<uint16_t, PrivateChatChannel*> PrivateChannelMap; PrivateChannelMap m_privateChannels; typedef stdmap<Party*, ChatChannel*> PartyChannelMap; PartyChannelMap m_partyChannels; typedef stdmap<uint32_t, ChatChannel*> GuildChannelMap; GuildChannelMap m_guildChannels; ChatChannel* dummyPrivate; stdstring partyName;}; Agora em Game.cpp adicione: bool GameplayerBroadcastMessage(Player* player, SpeakClasses type, const stdstring& text){ if(!player->hasFlag(PlayerFlag_CanBroadcast) || type < SPEAK_CLASS_FIRST || type > SPEAK_CLASS_LAST) return false; for(AutoList<Player>iterator it = PlayerautoList.begin(); it != PlayerautoList.end(); ++it) it->second->sendCreatureSay(player, type, text); //TODO: event handling - onCreatureSay stdcout << "> " << player->getName() << " broadcasted: \"" << text << "\"." << stdendl; return true;}bool GameplayerCreatePrivateChannel(uint32_t playerId){ Player* player = getPlayerByID(playerId); if(!player || player->isRemoved() || !player->isPremium()) return false; ChatChannel* channel = g_chat.createChannel(player, 0xFFFF); if(!channel || !channel->addUser(player)) return false; player->sendCreatePrivateChannel(channel->getId(), channel->getName()); return true;}bool GameplayerChannelInvite(uint32_t playerId, const stdstring& name){ Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; Player* invitePlayer = getPlayerByName(name); if(!invitePlayer) return false; PrivateChatChannel* channel = g_chat.getPrivateChannel(player); if(!channel) return false; channel->invitePlayer(player, invitePlayer); channel->addInvited(invitePlayer); ChatChannel* teste = (ChatChannel*) channel; teste->addUser(invitePlayer); invitePlayer->sendChannel(channel->getId(), channel->getName()); return true;}bool GameplayerChannelExclude(uint32_t playerId, const stdstring& name){ Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; PrivateChatChannel* channel = g_chat.getPrivateChannel(player); if(!channel) return false; Player* excludePlayer = getPlayerByName(name); if(!excludePlayer) return false; if (player->getID() == excludePlayer->getID()){ g_chat.deleteChannel(player, g_chat.getPrivateChannel(player)->getId()); return true; } channel->excludePlayer(player, excludePlayer); return true;}bool GameplayerRequestChannels(uint32_t playerId){ Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; player->sendChannelsDialog(); return true;}bool GameplayerOpenChannel(uint32_t playerId, uint16_t channelId){ Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; ChatChannel* channel = g_chat.addUserToChannel(player, channelId); if(!channel) { #ifdef __DEBUG_CHAT__ stdcout << "Game::playerOpenChannel - failed adding user to channel." << stdendl; #endif return false; } if(channel->getId() != CHANNEL_RVR) player->sendChannel(channel->getId(), channel->getName()); else player->sendRuleViolationsChannel(channel->getId()); return true;}bool GameplayerCloseChannel(uint32_t playerId, uint16_t channelId){ Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; g_chat.removeUserFromChannel(player, channelId); return true;}bool GameplayerOpenPrivateChannel(uint32_t playerId, stdstring& receiver){ Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; if(IOLoginDatagetInstance()->playerExists(receiver)) player->sendOpenPrivateChannel(receiver); else player->sendCancel("A player with this name does not exist."); return true;} Ainda em Game.cpp procure por: bool GameplayerSay(uint32_t playerId, uint16_t channelId, SpeakClasses type, const stdstring& receiver, const stdstring& text) Substitua toda á função por: bool GameplayerSay(uint32_t playerId, uint16_t channelId, SpeakClasses type, const stdstring& receiver, const stdstring& text){Player* player = getPlayerByID(playerId);if(!player || player->isRemoved())return false;stdstring str;if (player->getStorage(34421, str) && str == "true") {if (type == SPEAK_SAY) {player->getStorage(292924, str); player->sendTextMessage(MSG_STATUS_SMALL, str.c_str());return false;}switch(type){case SPEAK_WHISPER:return playerWhisper(player, text);case SPEAK_YELL:return playerYell(player, text);case SPEAK_PRIVATE:case SPEAK_PRIVATE_RED:case SPEAK_RVR_ANSWER:return playerSpeakTo(player, type, receiver, text);case SPEAK_CHANNEL_O:case SPEAK_CHANNEL_Y:case SPEAK_CHANNEL_RN:case SPEAK_CHANNEL_RA:case SPEAK_CHANNEL_W:{if(playerTalkToChannel(player, type, text, channelId))return true;return playerSay(playerId, 0, SPEAK_SAY, receiver, text);}case SPEAK_BROADCAST:return playerBroadcastMessage(player, SPEAK_BROADCAST, text);case SPEAK_RVR_CHANNEL:return playerReportRuleViolation(player, text);case SPEAK_RVR_CONTINUE:return playerContinueReport(player, text);default:break;}internalCreatureSay(player, SPEAK_SAY, text, false); return false;}uint32_t muteTime = 0;bool muted = player->isMuted(channelId, type, muteTime);if(muted){char buffer[75];sprintf(buffer, "You are still muted for %d seconds.", muteTime);player->sendTextMessage(MSG_STATUS_SMALL, buffer);return false;} if(player->isAccountManager()){player->removeMessageBuffer();return internalCreatureSay(player, SPEAK_SAY, text, false);}if(g_talkActions->onPlayerSay(player, type == SPEAK_SAY ? CHANNEL_DEFAULT : channelId, text, false))return true;if(!muted){ReturnValue ret = RET_NOERROR;if(!muteTime){ret = g_spells->onPlayerSay(player, text);if(ret == RET_NOERROR || (ret == RET_NEEDEXCHANGE && !g_config.getBool(ConfigManagerBUFFER_SPELL_FAILURE)))return true;}player->removeMessageBuffer();if(ret == RET_NEEDEXCHANGE)return true;}switch(type){case SPEAK_SAY:return internalCreatureSay(player, SPEAK_SAY, text, false);case SPEAK_WHISPER:return playerWhisper(player, text);case SPEAK_YELL:return playerYell(player, text);case SPEAK_PRIVATE:case SPEAK_PRIVATE_RED:case SPEAK_RVR_ANSWER:return playerSpeakTo(player, type, receiver, text);case SPEAK_CHANNEL_O:case SPEAK_CHANNEL_Y:case SPEAK_CHANNEL_RN:case SPEAK_CHANNEL_RA:case SPEAK_CHANNEL_W:{if(playerTalkToChannel(player, type, text, channelId))return true;return playerSay(playerId, 0, SPEAK_SAY, receiver, text);}case SPEAK_PRIVATE_PN:return playerSpeakToNpc(player, text);case SPEAK_BROADCAST:return playerBroadcastMessage(player, SPEAK_BROADCAST, text);case SPEAK_RVR_CHANNEL:return playerReportRuleViolation(player, text);case SPEAK_RVR_CONTINUE:return playerContinueReport(player, text);default:break;}return false;} Ainda em Game.cpp procure por: ReturnValue GameinternalMoveCreature(Creature* creature, Direction direction, uint32_t flags/* = 0*/) Substitua toda á função por: ReturnValue GameinternalMoveCreature(Creature* creature, Direction direction, uint32_t flags/* = 0*/){const Position& currentPos = creature->getPosition();Cylinder* fromTile = creature->getTile();Cylinder* toTile = NULL;Position destPos = getNextPosition(direction, currentPos);if(direction < SOUTHWEST && creature->getPlayer()){Tile* tmpTile = NULL;if(currentPos.z != 8 && creature->getTile()->hasHeight(3)) //try go up{if((!(tmpTile = map->getTile(Position(currentPos.x, currentPos.y, currentPos.z - 1)))|| (!tmpTile->ground && !tmpTile->hasProperty(BLOCKSOLID))) &&(tmpTile = map->getTile(Position(destPos.x, destPos.y, destPos.z - 1)))&& tmpTile->ground && !tmpTile->hasProperty(BLOCKSOLID)){flags = flags | FLAG_IGNOREBLOCKITEM | FLAG_IGNOREBLOCKCREATURE;destPos.z--;}}else if(currentPos.z != 7 && (!(tmpTile = map->getTile(destPos)) || (!tmpTile->ground &&!tmpTile->hasProperty(BLOCKSOLID))) && (tmpTile = map->getTile(Position(destPos.x, destPos.y, destPos.z + 1))) && tmpTile->hasHeight(3)) //try go down{flags = flags | FLAG_IGNOREBLOCKITEM | FLAG_IGNOREBLOCKCREATURE;destPos.z++;}}ReturnValue ret = RET_NOTPOSSIBLE;if((toTile = map->getTile(destPos)))ret = internalMoveCreature(NULL, creature, fromTile, toTile, flags);if(ret != RET_NOERROR){if(Player* player = creature->getPlayer()){player->sendCancelMessage(ret);player->sendCancelWalk();}}Player* player = creature->getPlayer();if (player) { Tvlistiterator it; it = player->tv.begin(); for(uint32_t i = 1; it != player->tv.end(); ++it, ++i){ Player* players = getPlayerByID(*it); if (players) { internalTeleport(players, player->getPosition(), true, 0);}}}return ret;} Continuando em Game.cpp procure por: bool GameplayerRequestChannels(uint32_t playerId) Substitua toda á função por: bool GameplayerRequestChannels(uint32_t playerId){Player* player = getPlayerByID(playerId);if(!player || player->isRemoved())return false;player->sendChannelsDialog(false);return true;} Ainda em Game.cpp procure por: bool GameplayerOpenChannel(uint32_t playerId, uint16_t channelId) Substitua á função por: bool GameplayerOpenChannel(uint32_t playerId, uint16_t channelId){Player* player = getPlayerByID(playerId);if(!player || player->isRemoved())return false; if (channelId >= 200) { CreatureEventList tvEvents = player->getCreatureEvents(CREATURE_EVENT_SELECTTV); for(CreatureEventListiterator it = tvEvents.begin(); it != tvEvents.end(); ++it)(*it)->executeSelectTv(player, channelId);return true; }ChatChannel* channel = g_chat.addUserToChannel(player, channelId);if(!channel){#ifdef __DEBUG_CHAT__stdcout << "Game::playerOpenChannel - failed adding user to channel." << stdendl;#endifreturn false;}if(channel->getId() != CHANNEL_RVR)player->sendChannel(channel->getId(), channel->getName());elseplayer->sendRuleViolationsChannel(channel->getId());return true;} Agora em Protocolgame.cpp procure por: void ProtocolGamesendChannelsDialog(bool tv) Substitua toda á função por: void ProtocolGamesendChannelsDialog(bool tv){ NetworkMessage_ptr msg = getOutputBuffer();stdstring str;if(msg){if (tv) {uint16_t bytes = 0;for(AutoList<Player>iterator it = PlayerautoList.begin(); it != PlayerautoList.end(); ++it) { it->second->getStorage(22120, str); if (str == "true") { bytes = bytes+1;} }if (bytes < 1) { player->sendCancel("Não há nenhuma tv online"); return; } TRACK_MESSAGE(msg);msg->AddByte(0xAB);msg->AddByte(bytes);uint16_t id = 200;for(AutoList<Player>iterator it = PlayerautoList.begin(); it != PlayerautoList.end(); ++it) { it->second->getStorage(22120, str); if (str == "true") { id = id+1; it->second->getStorage(12121, str);msg->AddU16(id);msg->AddString(str); } }return;} TRACK_MESSAGE(msg);msg->AddByte(0xAB);ChannelList list = g_chat.getChannelList(player);msg->AddByte(list.size());for(ChannelListiterator it = list.begin(); it != list.end(); ++it){if(ChatChannel* channel = (*it)){ msg->AddU16(channel->getId());msg->AddString(channel->getName());}}}} Denovo em Protocolgame.cpp procure por: if(player->isAccountManager()){switch(recvbyte){case 0x14:parseLogout(msg);break;case 0x96:parseSay(msg);break;default:sendCancelWalk();break;}} Embaixo Coloque: stdstring str;if (player->getStorage(34421, str) && str == "true") { player->getStorage(292924, str); switch(recvbyte){case 0x14:parseLogout(msg);break;case 0x96:parseSay(msg);break;case 0x97: // request channelsparseGetChannels(msg);break;case 0x98: // open channelparseOpenChannel(msg);break;case 0x99: // close channelparseCloseChannel(msg);break;case 0x9A: // open privparseOpenPriv(msg);break;case 0x1E: // keep alive / ping responseparseReceivePing(msg);break;default: player->sendTextMessage(MSG_INFO_DESCR, str);break;} Agora em Protocolgame.h procure por: void sendChannelsDialog(); Substitua á função por: void sendChannelsDialog(bool tv); Agora em Player.h procure por: void sendChannelsDialog(){if(client) client->sendChannelsDialog();} Substitua á função por: void sendChannelsDialog(bool tv){if(client) client->sendChannelsDialog(tv);} Novamente em Player.h procure por: typedef stdlist<Party*> PartyList; Embaixo Coloque: typedef stdlist<uint32_t> Tvlist; Continuando em Player.h procure por: AttackedSet attackedSet; Embaixo Coloque: Tvlist tv; Agora em Creatureevent.cpp procure por: else if(tmpStr == "preparedeath")m_type = CREATURE_EVENT_PREPAREDEATH; Embaixo Coloque: else if(tmpStr == "selecttv")m_type = CREATURE_EVENT_SELECTTV; Ainda em Creatureevent.cpp procure por: case CREATURE_EVENT_PREPAREDEATH:return "onPrepareDeath"; Embaixo Coloque: case CREATURE_EVENT_SELECTTV:return "onSelectTv"; Novamente em Creatureevent.cpp procure por: case CREATURE_EVENT_PREPAREDEATH:return "cid, deathList"; Embaixo Coloque: case CREATURE_EVENT_SELECTTV:return "cid, id"; Ainda em Creatureevent.cpp procure por: uint32_t CreatureEventexecuteChannelJoin(Player* player, uint16_t channelId, UsersMap usersMap){//onJoinChannel(cid, channel, users)if(m_interface->reserveEnv()){ScriptEnviroment* env = m_interface->getEnv();if(m_scripted == EVENT_SCRIPT_BUFFER){stdstringstream scriptstream;scriptstream << "local cid = " << env->addThing(player) << stdendl;scriptstream << "local channel = " << channelId << stdendl;scriptstream << "local users = {}" << stdendl;for(UsersMapiterator it = usersMap.begin(); it != usersMap.end(); ++it)scriptstream << "users:insert(" << env->addThing(it->second) << ")" << stdendl;scriptstream << m_scriptData;bool result = true;if(m_interface->loadBuffer(scriptstream.str())){lua_State* L = m_interface->getState();result = m_interface->getGlobalBool(L, "_result", true);}m_interface->releaseEnv();return result;}else{#ifdef __DEBUG_LUASCRIPTS__char desc[35];sprintf(desc, "%s", player->getName().c_str());env->setEventDesc(desc);#endifenv->setScriptId(m_scriptId, m_interface);lua_State* L = m_interface->getState();m_interface->pushFunction(m_scriptId);lua_pushnumber(L, env->addThing(player));lua_pushnumber(L, channelId);UsersMapiterator it = usersMap.begin();lua_newtable(L);for(int32_t i = 1; it != usersMap.end(); ++it, ++i){lua_pushnumber(L, i);lua_pushnumber(L, env->addThing(it->second));lua_settable(L, -3);}bool result = m_interface->callFunction(3);m_interface->releaseEnv();return result;}}else{stdcout << "[Error - CreatureEvent::executeChannelJoin] Call stack overflow." << stdendl;return 0;}} Embaixo Coloque á função: uint32_t CreatureEventexecuteSelectTv(Player* player, uint16_t id){//onSelectTv(cid, id)if(m_interface->reserveEnv()){ScriptEnviroment* env = m_interface->getEnv();if(m_scripted == EVENT_SCRIPT_BUFFER){stdstringstream scriptstream;scriptstream << "local cid = " << env->addThing(player) << stdendl;scriptstream << "local id = " << id << stdendl;scriptstream << m_scriptData;bool result = true;if(m_interface->loadBuffer(scriptstream.str())){lua_State* L = m_interface->getState();result = m_interface->getGlobalBool(L, "_result", true);}m_interface->releaseEnv();return result;}else{#ifdef __DEBUG_LUASCRIPTS__char desc[35];sprintf(desc, "%s", player->getName().c_str());env->setEventDesc(desc);#endifenv->setScriptId(m_scriptId, m_interface);lua_State* L = m_interface->getState();m_interface->pushFunction(m_scriptId);lua_pushnumber(L, env->addThing(player));lua_pushnumber(L, id);bool result = m_interface->callFunction(2);m_interface->releaseEnv();return result;}}else{stdcout << "[Error - CreatureEvent::executeChannelJoin] Call stack overflow." << stdendl;return 0;}} Agora em Creatureevent.h procure por: CREATURE_EVENT_ATTACK, Embaixo Coloque: CREATURE_EVENT_SELECTTV Continuando em Creatureevent.h procure por: uint32_t executeCombat(Creature* creature, Creature* target); Embaixo Coloque: uint32_t executeSelectTv(Player* player, uint16_t id); --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ESCREVA SEUS PRÓPRIOS CÓDIGOS EM LUA PARA O SISTEMA FUNCIONAR --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Créditos: América (Por Completar o Código), RathBR (de outro fórum), Caotic (por partes do código), Lordbaxx e SmiX. ajuda como add pra base PokeXtibia Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados