You need to modify sources:
talkaction.cpp
[cpp]bool TalkAction::ghost(Creature* creature, const std::string&, const std::string&)
{
Player* player = creature->getPlayer();
if(!player)
return false;
if(player->hasFlag(PlayerFlag_CannotBeSeen))
{
player->sendTextMessage(MSG_INFO_DESCR, "Command disabled for players with special, invisibility flag.");
return true;
}
SpectatorVec::iterator it;
SpectatorVec list = g_game.getSpectators(player->getPosition());
Player* tmpPlayer = NULL;
Condition* condition = NULL;
if((condition = player->getCondition(CONDITION_GAMEMASTER, CONDITIONID_DEFAULT, GAMEMASTER_INVISIBLE)))
{
player->sendTextMessage(MSG_INFO_DESCR, "You are visible again.");
IOLoginData::getInstance()->updateOnlineStatus(player->getGUID(), true);
for(AutoList<Player>::iterator pit = Player::autoList.begin(); pit != Player::autoList.end(); ++pit)
{
if(!pit->second->canSeeCreature(player))
pit->second->notifyLogIn(player);
}
for(it = list.begin(); it != list.end(); ++it)
{
if((tmpPlayer = (*it)->getPlayer()) && !tmpPlayer->canSeeCreature(player))
tmpPlayer->sendMagicEffect(player->getPosition(), MAGIC_EFFECT_TELEPORT);
}
player->removeCondition(condition);
g_game.internalCreatureChangeVisible(creature, VISIBLE_GHOST_APPEAR);
}
else if((condition = Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_GAMEMASTER, -1, 0, false, GAMEMASTER_INVISIBLE)))
{
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 = Player::autoList.begin(); pit != Player::autoList.end(); ++pit)
{
if(!pit->second->canSeeCreature(player))
pit->second->notifyLogOut(player);
}
IOLoginData::getInstance()->updateOnlineStatus(player->getGUID(), false);
if(player->isTrading())
g_game.internalCloseTrade(player);
player->clearPartyInvitations();
if(player->getParty())
player->getParty()->leave(player);
player->sendTextMessage(MSG_INFO_DESCR, "You are now invisible.");
}
return true;
}[/cpp]
Make it check if access is greater than 2 then unlimited, else if access 2 or less then check cooldown, if out of cooldown then allow invisibility for 5 seconds.
And change:
XML:
<talkaction log="yes" words="/ghost" access="3" event="function" value="ghost"/>
Remove "access="3" and talkaction log so the result will just be:
XML:
<words="/ghost" event="function" value="ghost"/>
Basic programming knowledge is required.