• logo_cipsoft
    Nowe serwery zostały otwarte 19 Lut 2025:
    Noctalia (Open PvP) Ignitera (Open PvP) us_logo Xybra (Open PvP)

[C++][Funkcja Lua] setPlayerExpRate(cid, rate)

Status
Zamknięty.

schikell

Active User
Dołączył
Kwiecień 26, 2008
Posty
148
Liczba reakcji
8
Skrypt by Umby

Ok, zaczynajmy.

W player.cpp

Ponizej:

Kod:
idleTime = 0;

Dodaj:

Kod:
expRate = 1;

Znajdz:

Kod:
return (result * g_config.getNumber(ConfigManager::RATE_EXPERIENCE) );

I zamien na:

Kod:
return ((result * g_config.getNumber(ConfigManager::RATE_EXPERIENCE)) * expRate);

Na koncu player.cpp

Dodaj:

Kod:
void Player::changePlayerExpRate(uint32_t rate)
{
	expRate = rate;
}


Teraz w player.h

Ponizej:

Kod:
void resetIdleTime() {idleTime = 0;}

Dodaj:

Kod:
uint32_t getExpRate() const {return expRate;}
void changePlayerExpRate(uint32_t rate);

Ponizej:

Kod:
int32_t idleTime;

Dodaj:

Kod:
uint32_t expRate;

W creature.cpp znajdz:

Kod:
return attacker->getPlayer() ? ((uint64_t)std::floor(getDamageRatio(attacker) * lostExperience * g_game.getExperienceStage(attacker->getPlayer()->getLevel()))) : ((uint64_t)std::floor(getDamageRatio(attacker) * lostExperience * g_config.getNumber(ConfigManager::RATE_EXPERIENCE) ));

I zamien to na:

Kod:
return attacker->getPlayer() ? (((uint64_t)std::floor(getDamageRatio(attacker) * lostExperience * g_game.getExperienceStage(attacker->getPlayer()->getLevel()))) * attacker->getPlayer()->getExpRate()) : ((uint64_t)std::floor(getDamageRatio(attacker) * lostExperience * g_config.getNumber(ConfigManager::RATE_EXPERIENCE)));

W luascript.cpp

Ponizej:

Kod:
lua_register(m_luaState, "escapeString", LuaScriptInterface::luaEscapeString);

Dodaj:

Kod:
lua_register(m_luaState, "setPlayerExpRate", LuaScriptInterface::luaSetPlayerExpRate);

Na samym dole luascript.cpp

Dodaj:

Kod:
int LuaScriptInterface::luaSetPlayerExpRate(lua_State *L)
{    
    uint32_t rate = popNumber(L);                    
    uint32_t cid = popNumber(L);            	
    ScriptEnviroment* env = getScriptEnv();	    
    Player* player = env->getPlayerByUID(cid);	       
            	
       if(player){    
			player->changePlayerExpRate(rate);
            lua_pushnumber(L, LUA_ERROR);
       }    
       else{       
           reportErrorFunc(getErrorDesc(LUA_ERROR_PLAYER_NOT_FOUND));
           lua_pushnumber(L, LUA_ERROR);
       }       
    return 1;
}

Oraz w luascript.h

Ponizej:

Kod:
static int32_t luaEscapeString(lua_State* L);

Dodaj:

Kod:
static int32_t luaSetPlayerExpRate(lua_State* L);

-- Jak to dziala ?

Jest to funkcja ktora mozy expRate.

-- Przykladowe zastosowanie

data/movements/scripts/exp.lua

Kod:
function onEquip(cid, item)
        setPlayerExpRate(cid, 4)
end

function onDeEquip(cid, item)
 	setPlayerExpRate(cid, 1)
end

data/movements/movements.xml

Kod:
	<movevent event="Equip" itemid="2179" slot="ring" function="onEquipItem" script="exp.lua"/>
	<movevent event="DeEquip" itemid="2179" slot="ring" function="onDeEquipItem" script="exp.lua"/>

ID 2179 jest to Gold Ring

Po dodaniu wyzej wymienionego przykladowego skryptu. Jezeli masz exp na serwerze x35 skrypt pomnozy to przez 4. Czyli 35*4= 140 exp. Oczywiscie po zalozeniu Gold Ringa.
 
Odp: [C++][Funkcja Lua] setPlayerExpRate(cid, rate)

OBS: Jest to inny kod ni? ten, kt?ry si? znajduje w TFSie.
 
Odp: [C++][Funkcja Lua] setPlayerExpRate(cid, rate)

To mon?y exp potwora czy ten co jest ustawiony w silniku ??

Pozdrawiam Zizi

#edit
nie zauwa?y?em tego zielonego
Przetestuje i dam edita
 
Status
Zamknięty.
Do góry