Jump to content
×
×
  • Create New...

Recommended Posts

Em 16/03/2017 em 09:46, Kevick disse:

 

 

 

TV System é um sistema que possibilita players assistirem outros jogadores pela tv em seu servidor, bom eu só irei deixar á parte dos códigos aqui vocês terão que desenvolver os scripts em lua para funcionar porém os códigos estão prontos e funcionais.

 

 

 

 

 

 

 

 

 

em luascript.cpp adicione:

 

 

 

Spoiler

 

  Ocultar conteúdo

 

 

 



 

 

//getCreatureNoMove(cid)

lua_register(m_luaState, "getCreatureNoMove", LuaScriptInterface::luaGetCreatureNoMove);

 

//doCreatureSetNoMove(cid, block)

lua_register(m_luaState, "doCreatureSetNoMove", LuaScriptInterface::luaDoCreatureSetNoMove);

 

//doInviteToPrivateChannel(cid, msg)

lua_register(m_luaState, "doInviteToPrivateChannel", LuaScriptInterface::luaDoInviteToPrivateChannel);

 

//doRemoveIntoPrivateChannel(cid, msg)

lua_register(m_luaState, "doRemoveIntoPrivateChannel", LuaScriptInterface::luaDoRemoveIntoPrivateChannel);

 

//doDeletePrivateChannel(cid)

lua_register(m_luaState, "doDeletePrivateChannel", LuaScriptInterface::luaDoDeletePrivateChannel);

 

//getCreatureHideHealth(cid)

lua_register(m_luaState, "getCreatureHideHealth", LuaScriptInterface::luaGetCreatureHideHealth);

 

//doCreatureSetHideHealth(cid, hide)

lua_register(m_luaState, "doCreatureSetHideHealth", LuaScriptInterface::luaDoCreatureSetHideHealth);

 

//doCreatePrivateChannel(cid)

lua_register(m_luaState, "doCreatePrivateChannel", LuaScriptInterface::luaDoCreatePrivateChannel);

 

 

 

 

 

ainda em luascript.cpp:

 

 

 

Spoiler

 

  Mostrar conteúdo oculto

 

 

 



 

 

int32_t LuaScriptInterface::luaGetCreatureHideHealth(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 LuaScriptInterface::luaDoCreatureSetHideHealth(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 LuaScriptInterface::luaDoRemoveIntoPrivateChannel(lua_State* L)

{

//doRemoveIntoPrivateChannel(cid, string)

std::string 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 LuaScriptInterface::luaDoDeletePrivateChannel(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 LuaScriptInterface::luaDoInviteToPrivateChannel(lua_State* L)

{

//doCreatePrivateChannel(cid)

std::string 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 LuaScriptInterface::luaDoCreatePrivateChannel(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 LuaScriptInterface::luaDoCreatureSetNoMove(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 LuaScriptInterface::luaGetCreatureNoMove(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;

}

 

 

 

 

 

agora em luascript.h adicione:

 

 

 

Spoiler

 

  Ocultar conteúdo

 

 

 



 

 

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 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);

 

 

 

 

 

agora vai em chat.cpp e adicione:

 

 

 

Spoiler

 

  Ocultar conteúdo

 

 

 



 

 

ChatChannel* Chat::createChannel(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(), ChatChannel::staticFlags)))

m_guildChannels[player->getGuildId()] = newChannel;

 

return newChannel;

}

 

case CHANNEL_PARTY:

{

ChatChannel* newChannel = NULL;

if(player->getParty() && (newChannel = new ChatChannel(channelId, partyName, ChatChannel::staticFlags)))

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", ChatChannel::staticFlags)))

{

newChannel->setOwner(player->getGUID());

m_privateChannels = newChannel;

}

 

return newChannel;

}

}

 

default:

break;

}

 

return NULL;

}

 

 

 

 

 

depois vá em chat.h e adicione:

 

 

 

Spoiler

 

  Ocultar conteúdo

 

 

 



 

 

class Player;

enum ChannelFlags_t

{

CHANNELFLAG_NONE = 0,

CHANNELFLAG_ENABLED = 1 << 0,

CHANNELFLAG_ACTIVE = 1 << 1,

CHANNELFLAG_LOGGED = 1 << 2,

};

 

typedef std::map<uint32_t, Player*> UsersMap;

typedef std::list<uint32_t> InviteList;

 

class ChatChannel

{

public:

ChatChannel(uint16_t id, const std::string& name, uint16_t flags, uint32_t access = 0,

uint32_t level = 1, Condition* condition = NULL, int32_t conditionId = -1,

const std::string& 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 std::string& getName() const {return m_name;}

uint16_t getFlags() const {return m_flags;}

 

int32_t getConditionId() const {return m_conditionId;}

const std::string& 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 std::string& text, uint32_t _time = 0);

 

protected:

uint16_t m_id, m_flags;

int32_t m_conditionId;

uint32_t m_access, m_level;

std::string m_name, m_conditionMessage;

 

Condition* m_condition;

VocationMap* m_vocationMap;

 

UsersMap m_users;

boost::shared_ptr<std::ofstream> 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 std::string& text, uint16_t channelId);

 

ChatChannel* getChannel(Player* player, uint16_t channelId);

ChatChannel* getChannelById(uint16_t channelId);

 

std::string 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 std::map<uint16_t, ChatChannel*> NormalChannelMap;

NormalChannelMap m_normalChannels;

 

typedef std::map<uint16_t, PrivateChatChannel*> PrivateChannelMap;

PrivateChannelMap m_privateChannels;

 

typedef std::map<Party*, ChatChannel*> PartyChannelMap;

PartyChannelMap m_partyChannels;

 

typedef std::map<uint32_t, ChatChannel*> GuildChannelMap;

GuildChannelMap m_guildChannels;

 

ChatChannel* dummyPrivate;

std::string partyName;

};

 

 

 

 

 

agora em game.cpp adicione:

 

 

 

Spoiler

 

  Ocultar conteúdo

 

 

 



 

 

bool Game::playerBroadcastMessage(Player* player, SpeakClasses type, const std::string& text)

{

if(!player->hasFlag(PlayerFlag_CanBroadcast) || type < SPEAK_CLASS_FIRST || type > SPEAK_CLASS_LAST)

return false;

 

for(AutoList<Player>::iterator it = Player::autoList.begin(); it != Player::autoList.end(); ++it)

it->second->sendCreatureSay(player, type, text);

 

//TODO: event handling - onCreatureSay

std::cout << "> " << player->getName() << " broadcasted: \"" << text << "\"." << std::endl;

return true;

}

 

bool Game::playerCreatePrivateChannel(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 Game::playerChannelInvite(uint32_t playerId, const std::string& 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 Game::playerChannelExclude(uint32_t playerId, const std::string& 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 Game::playerRequestChannels(uint32_t playerId)

{

Player* player = getPlayerByID(playerId);

if(!player || player->isRemoved())

return false;

 

player->sendChannelsDialog();

return true;

}

 

bool Game::playerOpenChannel(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__

std::cout << "Game::playerOpenChannel - failed adding user to channel." << std::endl;

#endif

return false;

}

 

if(channel->getId() != CHANNEL_RVR)

player->sendChannel(channel->getId(), channel->getName());

else

player->sendRuleViolationsChannel(channel->getId());

 

return true;

}

 

bool Game::playerCloseChannel(uint32_t playerId, uint16_t channelId)

{

Player* player = getPlayerByID(playerId);

if(!player || player->isRemoved())

return false;

 

g_chat.removeUserFromChannel(player, channelId);

return true;

}

 

bool Game::playerOpenPrivateChannel(uint32_t playerId, std::string& receiver)

{

Player* player = getPlayerByID(playerId);

if(!player || player->isRemoved())

return false;

 

if(IOLoginData::getInstance()->playerExists(receiver))

player->sendOpenPrivateChannel(receiver);

else

player->sendCancel("A player with this name does not exist.");

 

return true;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Créditos

 

 

 

 

Eu (Por postar aqui no EKZ)

 

 

 

 

Lordbaxx

 

 

 

 

Smix

 

 

 

 

errorrr

 

 

errrrrrrraaaaa.thumb.png.f03151acec781a3e320a6ec26752db1d.png

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.


    Administrador |  Diretor |  Coordenador |  Moderador |  Suporter |  Estagiário |  Herói
  • Similar Content

    • By erasv
      Pessoal, sou novo no XTibia e gostaria de pedir uma ajuda a vocês.
       
      Voltei a administrar servidor de Tibia e estava aqui tentando editar uns scripts para usar o comando de !reset.
       
      Esse comando funcionou bem no meu Server
      local config = { backToLevel = 40, redskull = false, -- need to be without redskull to reset? battle = true, -- need to be without battle to reset? pz = false, -- need to be in protect zone to reset? stages = { {resets = 4, level = 350, premium = 330}, {resets = 9, level = 355, premium = 340}, {resets = 14, level = 450, premium = 450}, {resets = 19, level = 600, premium = 600}, {resets = 24, level = 800, premium = 800}, {resets = 29, level = 1000, premium = 1000}, {resets = 34, level = 1100, premium = 1100}, {resets = 39, level = 1200, premium = 1200}, {resets = 44, level = 1300, premium = 1300}, {resets = 49, level = 1500, premium = 1500}, {resets = 54, level = 1600, premium = 1600}, {resets = 59, level = 1650, premium = 1650}, {resets = 64, level = 1700, premium = 1700}, {resets = 69, level = 1800, premium = 1800}, {resets = 74, level = 1850, premium = 1850}, {resets = 79, level = 1900, premium = 1900}, {resets = 84, level = 2200, premium = 2200}, {resets = 89, level = 2500, premium = 2500}, {resets = 94, level = 5000, premium = 5000}, {resets = 2^1024, level = 7000, premium = 7000} } } function onSay(cid, words, param) local function getPlayerResets(cid) local resets = getPlayerStorageValue(cid, 500) return resets < 0 and 0 or resets end local function doPlayerAddResets(cid, count) setPlayerStorageValue(cid, 500, getPlayerResets(cid) + count) end if config.redskull and getCreatureSkullType(cid) == 4 then return doPlayerSendCancel(cid, "Voce precisa estar sem red skull para resetar.") elseif config.pz and not getTilePzInfo(getCreaturePosition(cid)) then return doPlayerSendCancel(cid, "Voce precisa estar em protection zone para resetar.") elseif config.battle and getCreatureCondition(cid, CONDITION_INFIGHT) then return doPlayerSendCancel(cid, "Voce precisa estar sem battle para resetar.") end local resetLevel = 0 for x, y in ipairs(config.stages) do if getPlayerResets(cid) <= y.resets then resetLevel = isPremium(cid) and y.premium or y.level break end end if getPlayerLevel(cid) < resetLevel then return doPlayerSendCancel(cid, "Voce precida de level " .. resetLevel .. " para o proximo reset.") end doPlayerAddResets(cid, 1) local healthMax, manaMax = getCreatureMaxHealth(cid), getCreatureMaxMana(cid) doPlayerAddLevel(cid, -(getPlayerLevel(cid) - config.backToLevel)) setCreatureMaxHealth(cid, healthMax) setCreatureMaxMana(cid, manaMax) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_FIREWORK_RED) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Now you have " .. getPlayerResets(cid) .. " " .. (getPlayerResets(cid) == 1 and "reset" or "resets") .. ".") return true end  
      Porém, eu precisava de algumas modificações nele... eu precisava definir alguns pontos de mudança pós o reset, por exemplo, o jogador ganha 10% a mais de xp... esse tipo de coisa.
       
      Fora isso, o que eu precisava também (e mais importante) seria que esse reset fosse contabilizado numa row 'resets' da database do meu server que é MySQL.
       
      Vocês poderiam, por gentileza, me ajudar ou dar uma luz relacionado a isso?
       
      Ficaria muito grato!
       
    • By Haka
      Versão do Servidor: TFS - 0.3.5 Tipo de Script: Código: Quando eu tento compilar o fts aparece essse erro
       
        In constructor 'ODBCResult::ODBCResult(void*)': 
      351 databaseodbc.cpp 'res' was not declared in this scope
      351 databaseodbc.cpp *** [Obj/databaseodbc.o] Error 1  
       
      se alguem puder me ajudar, agradeceria muito
       
    • By Olimpo
      Versão do Servidor: TFS - 0.4 Tipo de Script: npc Código: Alguem teria um script de reset preferencialmente por source para otx2 atualizado https://github.com/mattyx14/otxserver/tree/otxserv2
      se for por distro as mudanças me diga aonde mudar eu mesmo compilo
      ou script normal mesmo, porem as configuraçoes do script seriam as seguintes
      level necessario para resetar = x
      aumento de x level para reset = x
      item e quantidade de item para resetar = x,x
      aumento de x items por reset= x
      vida e mana volta ao inicio ao resetar = true or false
      skills voltao ao inicio ao resetar = true false
      hp e mp adicional ganho /lvl por reset = 1% (configurável)
      dano e heal adicionado por reset = 1% configuravel
      reset voc = {x, x, x, x, x, x, x} (quando der o 10 reset por exemplo(configuravel) , será feito uma checagem de vocation para poder resetar, por exemplo até 10 resets qualquer voc reseta nao será feito checagem, porem no reset 10 só resetará se for uma das seguintes vocações, se for mais facil deixa só 1 reset configuravel assim se for dificil pode colocar apartir de tantos resets precisa da classe, coloque oque for mais pratico pois o efeito será o mesmo.
      teleport para o templo= true or false
      pode resetar com battle= true or false
      a cada x resets ganhe tal item (configuravel) reset x recebe item x ao resetar, reset =5 {2160, 100} - exemplo.
      nao me importa se será storage, source, script. só me importo com o resultado e que nao tenha bugs, quanto mais bem feito melhor na hora de negociar o preço, se nao for permitido este tipo de post aqui alguem me avise que eu retiro ele. se tem outro local por favor movam ele, mais informações mande msg no privado responderei assim que possível.
       
       
       
    • By Yan Liima
      Limite máximo de players em guild in-game 😜

      Bom galera estou postando esse conteúdo como complemento do limite em WEBSITE
      Ao utilizar !joinguild esse code verifica se a guilda já atingiu o limite máximo de membros(configurado)
      Eu estarei disponibilizando de duas maneiras:
      1º Será um valor configurado no proprio config.lua, onde determinará o limite máximo de todas as guild.(já incluido na 0.4 rev3996)
      2º A verificação será feita por DB, onde terá um valor padrão para cada guilda criada, podendo ser alterado o valor de membros maximo.
      Ou seja, a guilda número UM pode ter máximo de 50 players, e a guilda número DOIS pode ter o máximo de 100.
      Vocês pode ser criativos e vender items que aumenta o limite ou fazer eventos/sorteios para aumentar...

      Enfim, vamos lá...
      Primeira maneira:

       
      Segunda maneira:

       
      Prontinho galera, espero que ajude algumas pessoas xD
    • By Yan Oliveira
      Olá pessoal!
       
      Esse é um tutorial bem simples para o player(master) não poder atacar seus summons e o summon do player(master) não atacar outros players.
       
      Esse tutorial é muito útil principalmente para quem está desenvolvendo derivados.
       
      *OBS: Esse tutorial só funciona para TFS 1.X (1.0+)
       
      Vamos ao tutorial!!!
       
      Siga os passos à seguir:
       
      1-  Abra sua source e procure o arquivo combat.cpp
      2- Procure pela função: 
      ReturnValue Combat::canTargetCreature(Player* attacker, Creature* target) 3- Insira o código à seguir dentro da função encontrada no passo anterior:
      // BLOCO QUE O PLAYER (MASTER) NÃO PODE ATACAR O SUMMON // if (target->isSummon()) { return RETURNVALUE_YOUMAYNOTATTACKTHISCREATURE; } // BLOCO QUE O SUMMON DO PLAYER (MASTER) NÃO PODE ATACAR OUTRO JOGADOR // if (attacker->isSummon() && target->getPlayer()) { return RETURNVALUE_YOUMAYNOTATTACKTHISPLAYER; }  
      4- Compile a source
       
      Pronto! Agora está terminado e você pode jogar!
       
      Um recurso simples, mas bem útil.