Ir para conteúdo

[C++] TV SYSTEM [FUNCIONAL]


America

Posts Recomendados

                                                                  arhPioO.png

 

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.

 

 

 

arhPioO.png.8f7cdbae46873a0159538b19eb4a9559.png

Editado por America
Link para o comentário
Compartilhar em outros sites

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

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

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

  • 2 weeks later...
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

  • 3 years later...
Em 25/03/2017 em 16:00, America disse:

                                                                  arhPioO.png

 

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.

 

 

 

arhPioO.png.8f7cdbae46873a0159538b19eb4a9559.png

 

ajuda como add pra base PokeXtibia

Link para o comentário
Compartilhar em outros sites

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...