Add this to your Configmanager.cpp:
Code:
m_confInteger[LEVEL_TO_ROOK] = getGlobalNumber(L, "LevelToRook", 5);
m_confInteger[ROOK_TEMPLE_ID] = getGlobalNumber(L, "RookTempleId", 1);
Add this to your configmanager.h:
Code:
LEVEL_TO_ROOK,
ROOK_TEMPLE_ID,
Add this to your players.cpp:
Code:
void Player::sendToRook()
{
setVocation(VOCATION_NONE);
level = 1;
healthMax = 150;
manaMax = 0;
manaSpent = 0;
magLevel= 0;
#ifdef __PROTOCOL_76__
soul = 100;
soulMax = 100;
#endif // __PROTOCOL_76__
capacity = 400;
experience = 0;
for (int32_t i = SKILL_FIRST; i <= SKILL_LAST; ++i) {
skills[i][SKILL_LEVEL]= 10;
skills[i][SKILL_TRIES]= 0;
}
for (int32_t i = SLOT_FIRST; i < SLOT_LAST; ++i) {
if (inventory[i]) {
g_game.internalRemoveItem(inventory[i]);
}
}
__internalAddThing(SLOT_BACKPACK, Item::CreateItem(1987));
__internalAddThing(SLOT_RIGHT, Item::CreateItem(2382));
if (getSex() == PLAYERSEX_MALE)
__internalAddThing(SLOT_ARMOR, Item::CreateItem(2650));
else
__internalAddThing(SLOT_ARMOR, Item::CreateItem(2651));
Town* town = Towns::getInstance().getTown(g_config.getNumber(ConfigManager::ROOK_TEMPLE_ID));
if (town) {
setTown(town->getTownID());
loginPosition = town->getTemplePosition();
}
}
Now compare this Function with your Die Function and add what needs to be added....( I know, a little work, but it's quite easy to learn).
Code:
void Player::die()
{
for(ConditionList::iterator it = conditions.begin(); it != conditions.end();){
if((*it)->isPersistent()){
Condition* condition = *it;
it = conditions.erase(it);
condition->endCondition(this, CONDITIONEND_DIE);
onEndCondition(condition->getType());
delete condition;
}
else{
++it;
}
}
loginPosition = masterPos;
if(skillLoss){
//Magic level loss
uint32_t sumMana = 0;
int32_t lostMana = 0;
//sum up all the mana
for(uint32_t i = 1; i <= magLevel; ++i){
sumMana += vocation->getReqMana(i);
}
sumMana += manaSpent;
lostMana = (int32_t)std::ceil(sumMana * ((double)lossPercent[LOSS_MANASPENT]/100));
while((uint32_t)lostMana > manaSpent && magLevel > 0){
lostMana -= manaSpent;
manaSpent = vocation->getReqMana(magLevel);
magLevel--;
}
manaSpent = std::max((int32_t)0, (int32_t)manaSpent - lostMana);
magLevelPercent = Player::getPercentLevel(manaSpent, vocation->getReqMana(magLevel + 1));
//Skill loss
uint32_t lostSkillTries;
uint32_t sumSkillTries;
for(uint32_t i = 0; i <= 6; ++i){ //for each skill
lostSkillTries = 0; //reset to 0
sumSkillTries = 0;
for(uint32_t c = 11; c <= skills[i][SKILL_LEVEL]; ++c) { //sum up all required tries for all skill levels
sumSkillTries += vocation->getReqSkillTries(i, c);
}
sumSkillTries += skills[i][SKILL_TRIES];
lostSkillTries = (uint32_t)std::ceil(sumSkillTries * ((double)lossPercent[LOSS_SKILLTRIES]/100));
while(lostSkillTries > skills[i][SKILL_TRIES]){
lostSkillTries -= skills[i][SKILL_TRIES];
skills[i][SKILL_TRIES] = vocation->getReqSkillTries(i, skills[i][SKILL_LEVEL]);
if(skills[i][SKILL_LEVEL] > 10){
skills[i][SKILL_LEVEL]--;
}
else{
skills[i][SKILL_LEVEL] = 10;
skills[i][SKILL_TRIES] = 0;
lostSkillTries = 0;
break;
}
}
skills[i][SKILL_TRIES] = std::max((int32_t)0, (int32_t)(skills[i][SKILL_TRIES] - lostSkillTries));
}
//
//Level loss
uint32_t newLevel = level;
uint32_t oldLevel = level;
while((uint64_t)(experience - getLostExperience()) < Player::getExpForLevel(newLevel)){
if(newLevel > 1)
newLevel--;
else
break;
}
if(newLevel != level){
uint32_t levelToRook = g_config.getNumber(ConfigManager::LEVEL_TO_ROOK);
bool rooked = false;
if((newLevel <= levelToRook) && getVocationId() != 0) {
sendToRook();
rooked = true;
}
if (rooked) {
newLevel = 1;
}
std::stringstream lvMsg;
lvMsg << "You were downgraded from level " << oldLevel << " to level " << newLevel << ".";
sendTextMessage(MSG_EVENT_ADVANCE, lvMsg.str());
}
}
}
Now in your player.h add this line:
Just before these lines:
Code:
void onDie();
void die();
Voila, it should be working.