CA

doCreateMonsterNick(monster, nick, pos)

Por caotic, 24 de jan. de 2014 em Linguagens de Programação

nick system
mudança de nome
pokemon nick
nick
name changer
name monster
otserv
tibia
script
29
6.9k
caoticC
24 de janeiro de 2014 às 12:51

Tudo bem galera xtibiana?

Resolvi trazer a vocês um sistema de nick que permite mudar o nome do monstro in-game.

A função e simples de se usar e não tem nenhum tipo de limitação ela foi desenvolvida na versão 8.6 com a tfs 0.3.6.

Lets go:

 

Vá em monster.h e procure isto:

typedef std::list<Creature*> CreatureList;
class Monster : public Creature
{
private:
Monster(MonsterType* _mType);
 
public:
#ifdef __ENABLE_SERVER_DIAGNOSTIC__
static uint32_t monsterCount;
#endif
virtual ~Monster();
E coloque este codigo em baixo:
std::string nick,realname;
Continue em monster.h e procure:
static Monster* createMonster(const std::string& name);
E coloque embaixo:
static Monster* createMonsterNick(const std::string& name, std::string nick);
Procure também:
virtual const std::string& getName() const {return mType->name;}
E substitua por isto:
virtual const std::string& getName() const {return nick;}

Depois vá em monster.cpp e procure:

Monster* Monster::createMonster(const std::string& name)
{
MonsterType* mType = g_monsters.getMonsterType(name);
if(!mType)
return NULL;
 
return createMonster(mType);
}
Substitua por:
Monster* Monster::createMonster(const std::string& name)
{
MonsterType* mType = g_monsters.getMonsterType(name);
if(!mType)
return NULL;
 
mType->name = name;
 
return createMonster(mType);
}
 
Monster* Monster::createMonsterNick(const std::string& name, std::string nick)
{
MonsterType* mType = g_monsters.getMonsterType(name);
if(!mType)
return NULL;
if (!(nick == "")) {
                  mType->name = nick;
                 }
  
return createMonster(mType);
}

Continuando em monster.cpp procure:

currentOutfit = mType->outfit;

Adicionar embaixo:

nick = mType->name;

Vá em luascript.h e procure isto

static int32_t luaDoCreateNpc(lua_State* L);

Embaixo coloque:

static int32_t luaDoCreateMonsterNick(lua_State* L);
static int32_t luaGetCreatureNickRealName(lua_State* L);

Em luascript.cpp procure:

//doPlayerSetIdleTime(cid, amount)
lua_register(m_luaState, "doPlayerSetIdleTime", LuaScriptInterface::luaDoPlayerSetIdleTime);

Coloque embaixo:

//doCreateMonster(monster, nick, pos)
lua_register(m_luaState, "doCreateMonsterNick", LuaScriptInterface::luaDoCreateMonsterNick);

Continue em luascript.cpp e procure isto:

int32_t LuaScriptInterface::luaGetCreatureName(lua_State* L)
{
	//getCreatureName(cid)
	ScriptEnviroment* env = getEnv();
	if(Creature* creature = env->getCreatureByUID(popNumber(L)))
		lua_pushstring(L, creature->getName().c_str());
	else
	{
		errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND));
		lua_pushboolean(L, false);
	}

	return 1;
}

Coloque isto:

int32_t LuaScriptInterface::luaGetCreatureNickRealName(lua_State* L)
{
	//getCreatureNickRealName(cid)
	ScriptEnviroment* env = getEnv();
	if(Monster* monster = env->getCreatureByUID(popNumber(L))->getMonster())
		lua_pushstring(L, monster->realname.c_str());
	else
	{
		errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND));
		lua_pushboolean(L, false);
	}

	return 1;
}


int32_t LuaScriptInterface::luaDoCreateMonsterNick(lua_State* L)
{
	//doCreateMonsterNick(monster, nick, pos)
	ScriptEnviroment* env = getEnv();
	PositionEx pos;
	popPosition(L, pos);
	std::string nick = popString(L);
	const std::string name = popString(L).c_str();
	
	Monster* monster = Monster::createMonsterNick(name, nick);
	if(!monster)
	{
		errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND));
		lua_pushboolean(L, false);
		return 1;
    }
    
    	if(!g_game.placeCreature(monster, pos))
	{
		delete monster;
			errorEx("Cannot create monster: " + name);
		lua_pushboolean(L, false);
		return 1;
	}
	
			monster->realname = name;
       	lua_pushnumber(L, env->addThing((Thing*)monster));	
	return 1;
}

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

Exemplo de uso:

function onSay(cid, words, param, channel)
	
local t = string.explode(param, ",")
doCreateMonsterNick(t[1], t[2], getThingPos(cid))
return true
end

Editado Março 11 por caotic

24 de janeiro de 2014 às 14:30

muito grande, deu ate preguiça de ler mas Parece um sistema muito bom, parabéns

HyakiH
24 de janeiro de 2014 às 15:30

Muito obrigado, eu estava atras dessa função já tinha algum tempo!

StrogmanS
24 de janeiro de 2014 às 17:14

isso nao causaria um erro?

ScriptEnvir oment* env = getEnv();

 

nao seria assim não?

ScriptEnviroment* env = getEnv();
caoticC
24 de janeiro de 2014 às 17:43

 

isso nao causaria um erro?

ScriptEnvir oment* env = getEnv();

nao seria assim não?

ScriptEnviroment* env = getEnv();

 

Deve ser na hora de eu copiar e acabei clicando em espaço sem perceber

Editado Janeiro 24 por caotic

HyakiH
24 de janeiro de 2014 às 19:55

Era por isso que eu não conseguia compilar :s

LordfireL
24 de janeiro de 2014 às 23:27

Eu trocaria

Monster* Monster::createMonsterNick(const std::string& name, std::string nick) {
  MonsterType* mType = g_monsters.getMonsterType(name);
  if(!mType)
    return NULL;
  if (!(nick == "")) {
    mType->name = nick;
  }
  return createMonster(mType);
}
por

Monster* Monster::createMonsterNick(const std::string& name, std::string nick) {
  MonsterType* mType = g_monsters.getMonsterType(name);
  if(!mType || nick.empty())
    return NULL;
  mType->name = nick;
  return createMonster(mType);
}
Porque não vejo utilidade na função se for dado um "nick" vazio. Assim você mata um if e algumas linhas.

 

Também dá pra reduzir um pouco aqui e continuar legível:

Monster* Monster::createMonster(const std::string& name) {
  MonsterType* mType = g_monsters.getMonsterType(name);
  if(!mType)
    return NULL;
  return createMonster(mType);
}
por

Monster* Monster::createMonster(const std::string& name) {
  MonsterType* mType = g_monsters.getMonsterType(name);
  return mType ? createMonster(mType) : NULL;
}
caoticC
25 de janeiro de 2014 às 03:16

Eu trocaria

Monster* Monster::createMonsterNick(const std::string& name, std::string nick) {
  MonsterType* mType = g_monsters.getMonsterType(name);
  if(!mType)
    return NULL;
  if (!(nick == "")) {
    mType->name = nick;
  }
  return createMonster(mType);
}
por

Monster* Monster::createMonsterNick(const std::string& name, std::string nick) {
  MonsterType* mType = g_monsters.getMonsterType(name);
  if(!mType || nick.empty())
    return NULL;
  mType->name = nick;
  return createMonster(mType);
}
Porque não vejo utilidade na função se for dado um "nick" vazio. Assim você mata um if e algumas linhas.

 

Também dá pra reduzir um pouco aqui e continuar legível:

Monster* Monster::createMonster(const std::string& name) {
  MonsterType* mType = g_monsters.getMonsterType(name);
  if(!mType)
    return NULL;
  return createMonster(mType);
}
por

Monster* Monster::createMonster(const std::string& name) {
  MonsterType* mType = g_monsters.getMonsterType(name);
  return mType ? createMonster(mType) : NULL;
}
if(!mType || nick.empty())
return NULL;

A possiblidade do cara colocar uma string vazia logo o mType do monstro seria ignorado.

Diminuição de linha é encheção de linguiça.

Editado Janeiro 25 por caotic

MaenilseM
26 de janeiro de 2014 às 12:37

Realmente otimo este codigo, parabens

1 mês depois...
nociamN
15 de fevereiro de 2014 às 14:40

Alguém testo em serve de pokemon PDA e funciona?

zipter98Z
17 de fevereiro de 2014 às 19:01

@nociam

Cara, como alguém vai adicionar essa função no PDA sem as sources?

SmiXS
17 de fevereiro de 2014 às 20:57

kkkk Isso já tem no PDA.

Junior001J
19 de fevereiro de 2014 às 20:28

Belo sistema Caotic :D irei testar aqui :D

LuaniTaL
20 de fevereiro de 2014 às 16:28

Eu não entendi muito bem.

Ele da 1 nick ao monster? Isso quer dizer o que exatamente? .-.

Troca o nome dele por outro?

nociamN
25 de fevereiro de 2014 às 18:42

Uhm falei errado tenho as sources do pda versao 5 ai gostaria de saber se isso pode funcionar.


Entao tem esse erro nao aparece o nome de nenhum mostro

y0qs.png