Ir para conteúdo
  • Cadastre-se

(Resolvido)[Duvida] Healing Source


Ir para solução Resolvido por MaTTch,

Posts Recomendados

 

Bem, estou editando uma tfs e queria saber em quais códigos eu mecho, para que quando use exura, exura vita, etc, mostre só o quanto healou, e não o quanto heala, igual a distro do OTX Server !

 

Quem souber e quiser me ajudar, agradeceria, ;)

 
 
Link para o post
Compartilhar em outros sites

Isso não é na source, olha seu config.lua que vai ter la.

Tenho 100% de certeza que é na source amigo ;S porém não sei quais códigos que mudam isso, pra quando estiver full hp nao mostrar o quanto a magia heala, e sim só mostrar qnd tiver com hp baixo :D

Link para o post
Compartilhar em outros sites

Acho que voces nao estao entendendo :S, tipo cara, na source otx, se voce estiver com HP FULL ou seja 100/100, ele nao mostra a animaçao, mas se voce estiver com 50/100 ele mostra +50 na animaçao, quero fazer isso na tfs, pq na tfs ele mostra o quanto a magia heala, mesmo se estiver com hp full 100/100, ele mostra a animaçao +200, entende? '-'

Link para o post
Compartilhar em outros sites

Em game.cpp, procure por:

bool Game::combatChangeHealth

dentro dessa função, procure por:

if(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE) && !target->isGhost() &&
	(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE_MONSTER) || !target->getMonster()))

e substitua por:

if(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE) && !target->isGhost() &&
	(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE_MONSTER) || !target->getMonster()))
{
	int32_t realHeal = healthChange;
	if((realHeal + target->getHealth()) > target->getMaxHealth())
		realHeal = (target->getMaxHealth() - target->getHealth());
	
	if(realHeal > 0)
	{
		char buffer[20];
		sprintf(buffer, "+%d", realHeal);

		const SpectatorVec& list = getSpectators(targetPos);
		if(combatType != COMBAT_HEALING)
			addMagicEffect(list, targetPos, MAGIC_EFFECT_WRAPS_BLUE);

		addAnimatedText(list, targetPos, COLOR_GREEN, buffer);
	}
}

OBS: Não testei, apenas fiz em base dos meus conhecimentos.

Editado por MaTTch (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

também quero saber, se souber me manda pm, se eu descobrir te aviso também, to usando 0.4 (3777) e você?

0.4 tbm amigo :), cansei de otx , quero edita minha propria, mesmo sem entender mas td bem kkkkkkkkk, otx muitos bugs :S

OBS: Não testei, apenas fiz em base dos meus conhecimentos.

Irei testar aqui ;D

Funcionou nao :S nao mudou em nada xdd

Editado por gbik (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

0.4 tbm amigo :), cansei de otx , quero edita minha propria, mesmo sem entender mas td bem kkkkkkkkk, otx muitos bugs :S

Irei testar aqui ;D

Funcionou nao :S nao mudou em nada xdd

Posta a função bool Game::combatChangeHealth aqui.

Link para o post
Compartilhar em outros sites

Posta a função bool Game::combatChangeHealth aqui.

 

bool Game::combatChangeHealth(CombatType_t combatType, Creature* attacker, Creature* target, int32_t healthChange,

    MagicEffect_t hitEffect/* = MAGIC_EFFECT_UNKNOWN*/, Color_t hitColor/* = COLOR_UNKNOWN*/, bool force/* = false*/)

{

    const Position& targetPos = target->getPosition();

    if(healthChange > 0)

    {

        if(!force && target->getHealth() <= 0)

            return false;

        bool deny = false;

        CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);

        for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)

        {

            if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_HEALTHGAIN, combatType, healthChange))

                deny = true;

        }

        if(deny)

            return false;

        target->gainHealth(attacker, healthChange);

        if(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE) && !target->isGhost() &&

            (g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE_MONSTER) || !target->getMonster()))

        {

            char buffer[20];

            sprintf(buffer, "+%d", healthChange);

            const SpectatorVec& list = getSpectators(targetPos);

            if(combatType != COMBAT_HEALING)

                addMagicEffect(list, targetPos, MAGIC_EFFECT_WRAPS_BLUE);

            addAnimatedText(list, targetPos, COLOR_MAYABLUE, buffer);

        }

    }

    else

    {

        const SpectatorVec& list = getSpectators(targetPos);

        if(!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR)

        {

            addMagicEffect(list, targetPos, MAGIC_EFFECT_POFF);

            return true;

        }

        int32_t damage = -healthChange;

        if(damage != 0)

        {

            if(target->hasCondition(CONDITION_MANASHIELD) && combatType != COMBAT_UNDEFINEDDAMAGE)

            {

                int32_t manaDamage = std::min(target->getMana(), damage);

                damage = std::max((int32_t)0, damage - manaDamage);

                if(manaDamage != 0)

                {

                    bool deny = false;

                    CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);

                    for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)

                    {

                        if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_MANALOSS, combatType, manaDamage))

                            deny = true;

                    }

                    if(deny)

                        return false;

                    target->drainMana(attacker, combatType, manaDamage);

                    char buffer[20];

                    sprintf(buffer, "%d", manaDamage);

                    addMagicEffect(list, targetPos, MAGIC_EFFECT_LOSE_ENERGY);

                    addAnimatedText(list, targetPos, COLOR_BLUE, buffer);

                }

            }

            damage = std::min(target->getHealth(), damage);

            if(damage > 0)

            {

                bool deny = false;

                CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);

                for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)

                {

                    if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_HEALTHLOSS, combatType, damage))

                        deny = true;

                }

                if(deny)

                    return false;

                target->drainHealth(attacker, combatType, damage);

                addCreatureHealth(list, target);

                Color_t textColor = COLOR_NONE;

                MagicEffect_t magicEffect = MAGIC_EFFECT_NONE;

                switch(combatType)

                {

                    case COMBAT_PHYSICALDAMAGE:

                    {

                        Item* splash = NULL;

                        switch(target->getRace())

                        {

                            case RACE_VENOM:

                                textColor = COLOR_LIGHTGREEN;

                                magicEffect = MAGIC_EFFECT_POISON;

                                splash = Item::CreateItem(ITEM_SMALLSPLASH, FLUID_GREEN);

                                break;

                            case RACE_BLOOD:

                                textColor = COLOR_RED;

                                magicEffect = MAGIC_EFFECT_DRAW_BLOOD;

                                splash = Item::CreateItem(ITEM_SMALLSPLASH, FLUID_BLOOD);

                                break;

                            case RACE_UNDEAD:

                                textColor = COLOR_GREY;

                                magicEffect = MAGIC_EFFECT_HIT_AREA;

                                break;

                            case RACE_FIRE:

                                textColor = COLOR_ORANGE;

                                magicEffect = MAGIC_EFFECT_DRAW_BLOOD;

                                break;

                            case RACE_ENERGY:

                                textColor = COLOR_PURPLE;

                                magicEffect = MAGIC_EFFECT_PURPLEENERGY;

                                break;

                            default:

                                break;

                        }

                        if(splash)

                        {

                            internalAddItem(NULL, target->getTile(), splash, INDEX_WHEREEVER, FLAG_NOLIMIT);

                            startDecay(splash);

                        }

                        break;

                    }

                    case COMBAT_ENERGYDAMAGE:

                    {

                        textColor = COLOR_PURPLE;

                        magicEffect = MAGIC_EFFECT_ENERGY_DAMAGE;

                        break;

                    }

                    case COMBAT_EARTHDAMAGE:

                    {

                        textColor = COLOR_LIGHTGREEN;

                        magicEffect = MAGIC_EFFECT_POISON_RINGS;

                        break;

                    }

                    case COMBAT_DROWNDAMAGE:

                    {

                        textColor = COLOR_LIGHTBLUE;

                        magicEffect = MAGIC_EFFECT_LOSE_ENERGY;

                        break;

                    }

                    case COMBAT_FIREDAMAGE:

                    {

                        textColor = COLOR_ORANGE;

                        magicEffect = MAGIC_EFFECT_HITBY_FIRE;

                        break;

                    }

                    case COMBAT_ICEDAMAGE:

                    {

                        textColor = COLOR_TEAL;

                        magicEffect = MAGIC_EFFECT_ICEATTACK;

                        break;

                    }

                    case COMBAT_HOLYDAMAGE:

                    {

                        textColor = COLOR_YELLOW;

                        magicEffect = MAGIC_EFFECT_HOLYDAMAGE;

                        break;

                    }

                    case COMBAT_DEATHDAMAGE:

                    {

                        textColor = COLOR_DARKRED;

                        magicEffect = MAGIC_EFFECT_SMALLCLOUDS;

                        break;

                    }

                    case COMBAT_LIFEDRAIN:

                    {

                        textColor = COLOR_RED;

                        magicEffect = MAGIC_EFFECT_WRAPS_RED;

                        break;

                    }

                    default:

                        break;

                }

                if(hitEffect != MAGIC_EFFECT_UNKNOWN)

                    magicEffect = hitEffect;

                if(hitColor != COLOR_UNKNOWN)

                    textColor = hitColor;

                if(textColor < COLOR_NONE && magicEffect < MAGIC_EFFECT_NONE)

                {

                    char buffer[20];

                    sprintf(buffer, "%d", damage);

                    addMagicEffect(list, targetPos, magicEffect);

                    addAnimatedText(list, targetPos, textColor, buffer);

                }

            }

        }

    }

    return true;

}

 

Link para o post
Compartilhar em outros sites
  • Solução

Tenta assim:

bool Game::combatChangeHealth(CombatType_t combatType, Creature* attacker, Creature* target, int32_t healthChange,
MagicEffect_t hitEffect/* = MAGIC_EFFECT_UNKNOWN*/, Color_t hitColor/* = COLOR_UNKNOWN*/, bool force/* = false*/)
{
const Position& targetPos = target->getPosition();
if(healthChange > 0)
{
if(!force && target->getHealth() <= 0)
return false;
 
bool deny = false;
CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)
{
if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_HEALTHGAIN, combatType, healthChange))
deny = true;
}
 
if(deny)
return false;
 
if(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE) && !target->isGhost() &&
(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE_MONSTER) || !target->getMonster()))
{
int32_t realHeal = healthChange;
if((realHeal + target->getHealth()) > target->getMaxHealth())
realHeal = (target->getMaxHealth() - target->getHealth());
 
if(realHeal > 0)
{
char buffer[20];
sprintf(buffer, "+%d", realHeal);
 
const SpectatorVec& list = getSpectators(targetPos);
if(combatType != COMBAT_HEALING)
addMagicEffect(list, targetPos, MAGIC_EFFECT_WRAPS_BLUE);
 
addAnimatedText(list, targetPos, COLOR_GREEN, buffer);
}
}
target->gainHealth(attacker, healthChange);
}
else
{
const SpectatorVec& list = getSpectators(targetPos);
if(!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR)
{
addMagicEffect(list, targetPos, MAGIC_EFFECT_POFF);
return true;
}
 
int32_t damage = -healthChange;
if(damage != 0)
{
if(target->hasCondition(CONDITION_MANASHIELD) && combatType != COMBAT_UNDEFINEDDAMAGE)
{
int32_t manaDamage = std::min(target->getMana(), damage);
damage = std::max((int32_t)0, damage - manaDamage);
if(manaDamage != 0)
{
bool deny = false;
CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)
{
if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_MANALOSS, combatType, manaDamage))
deny = true;
}
 
if(deny)
return false;
 
target->drainMana(attacker, combatType, manaDamage);
char buffer[20];
sprintf(buffer, "%d", manaDamage);
 
addMagicEffect(list, targetPos, MAGIC_EFFECT_LOSE_ENERGY);
addAnimatedText(list, targetPos, COLOR_BLUE, buffer);
}
}
 
damage = std::min(target->getHealth(), damage);
if(damage > 0)
{
bool deny = false;
CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)
{
if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_HEALTHLOSS, combatType, damage))
deny = true;
}
 
if(deny)
return false;
 
target->drainHealth(attacker, combatType, damage);
addCreatureHealth(list, target);
 
Color_t textColor = COLOR_NONE;
MagicEffect_t magicEffect = MAGIC_EFFECT_NONE;
switch(combatType)
{
case COMBAT_PHYSICALDAMAGE:
{
Item* splash = NULL;
switch(target->getRace())
{
case RACE_VENOM:
textColor = COLOR_LIGHTGREEN;
magicEffect = MAGIC_EFFECT_POISON;
splash = Item::CreateItem(ITEM_SMALLSPLASH, FLUID_GREEN);
break;
 
case RACE_BLOOD:
textColor = COLOR_RED;
magicEffect = MAGIC_EFFECT_DRAW_BLOOD;
splash = Item::CreateItem(ITEM_SMALLSPLASH, FLUID_BLOOD);
break;
 
case RACE_UNDEAD:
textColor = COLOR_GREY;
magicEffect = MAGIC_EFFECT_HIT_AREA;
break;
 
case RACE_FIRE:
textColor = COLOR_ORANGE;
magicEffect = MAGIC_EFFECT_DRAW_BLOOD;
break;
 
case RACE_ENERGY:
textColor = COLOR_PURPLE;
magicEffect = MAGIC_EFFECT_PURPLEENERGY;
break;
 
default:
break;
}
 
if(splash)
{
internalAddItem(NULL, target->getTile(), splash, INDEX_WHEREEVER, FLAG_NOLIMIT);
startDecay(splash);
}
break;
}
 
case COMBAT_ENERGYDAMAGE:
{
textColor = COLOR_PURPLE;
magicEffect = MAGIC_EFFECT_ENERGY_DAMAGE;
break;
}
 
case COMBAT_EARTHDAMAGE:
{
textColor = COLOR_LIGHTGREEN;
magicEffect = MAGIC_EFFECT_POISON_RINGS;
break;
}
 
case COMBAT_DROWNDAMAGE:
{
textColor = COLOR_LIGHTBLUE;
magicEffect = MAGIC_EFFECT_LOSE_ENERGY;
break;
}
 
case COMBAT_FIREDAMAGE:
{
textColor = COLOR_ORANGE;
magicEffect = MAGIC_EFFECT_HITBY_FIRE;
break;
}
 
case COMBAT_ICEDAMAGE:
{
textColor = COLOR_TEAL;
magicEffect = MAGIC_EFFECT_ICEATTACK;
break;
}
 
case COMBAT_HOLYDAMAGE:
{
textColor = COLOR_YELLOW;
magicEffect = MAGIC_EFFECT_HOLYDAMAGE;
break;
}
 
case COMBAT_DEATHDAMAGE:
{
textColor = COLOR_DARKRED;
magicEffect = MAGIC_EFFECT_SMALLCLOUDS;
break;
}
 
case COMBAT_LIFEDRAIN:
{
textColor = COLOR_RED;
magicEffect = MAGIC_EFFECT_WRAPS_RED;
break;
}
 
default:
break;
}
 
if(hitEffect != MAGIC_EFFECT_UNKNOWN)
magicEffect = hitEffect;
 
if(hitColor != COLOR_UNKNOWN)
textColor = hitColor;
 
if(textColor < COLOR_NONE && magicEffect < MAGIC_EFFECT_NONE)
{
char buffer[20];
sprintf(buffer, "%d", damage);
 
addMagicEffect(list, targetPos, magicEffect);
addAnimatedText(list, targetPos, textColor, buffer);
}
}
}
}
 
return true;
}

Link para o post
Compartilhar em outros sites

Vou tentar, pera :D

 

Funcionou , mas esse e so o da life ne? e o da mana? tem como me passar tbm? kk

bool Game::combatChangeMana(Creature* attacker, Creature* target, int32_t manaChange)
{
    const Position& targetPos = target->getPosition();
    if(manaChange > 0)
    {
        bool deny = false;
        CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
        for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)
        {
            if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_MANAGAIN, COMBAT_HEALING, manaChange))
                deny = true;
        }

        if(deny)
            return false;

        target->changeMana(manaChange);
        if(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE) && !target->isGhost() &&
            (g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE_MONSTER) || !target->getMonster()))
        {
            char buffer[20];
            sprintf(buffer, "+%d", manaChange);

            const SpectatorVec& list = getSpectators(targetPos);
            addAnimatedText(list, targetPos, COLOR_DARKPURPLE, buffer);
        }
    }
    else
    {
        const SpectatorVec& list = getSpectators(targetPos);
        if(!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR)
        {
            addMagicEffect(list, targetPos, MAGIC_EFFECT_POFF);
            return false;
        }

        int32_t manaLoss = std::min(target->getMana(), -manaChange);
        BlockType_t blockType = target->blockHit(attacker, COMBAT_MANADRAIN, manaLoss);
        if(blockType != BLOCK_NONE)
        {
            addMagicEffect(list, targetPos, MAGIC_EFFECT_POFF);
            return false;
        }

        if(manaLoss > 0)
        {
            bool deny = false;
            CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
            for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)
            {
                if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_MANALOSS, COMBAT_UNDEFINEDDAMAGE, manaChange))
                    deny = true;
            }

            if(deny)
                return false;

            target->drainMana(attacker, COMBAT_MANADRAIN, manaLoss);
            char buffer[20];
            sprintf(buffer, "%d", manaLoss);

            addAnimatedText(list, targetPos, COLOR_BLUE, buffer);
        }
    }

    return true;
}

void Game::addCreatureHealth(const Creature* target)
{
    const SpectatorVec& list = getSpectators(target->getPosition());
    addCreatureHealth(list, target);
}

void Game::addCreatureHealth(const SpectatorVec& list, const Creature* target)
{
    Player* player = NULL;
    for(SpectatorVec::const_iterator it = list.begin(); it != list.end(); ++it)
    {
        if((player = (*it)->getPlayer()))
            player->sendCreatureHealth(target);
    }
}

void Game::addCreatureSquare(const Creature* target, uint8_t squareColor)
{
    const SpectatorVec& list = getSpectators(target->getPosition());
    addCreatureSquare(list, target, squareColor);
}

void Game::addCreatureSquare(const SpectatorVec& list, const Creature* target, uint8_t squareColor)
{
    Player* player = NULL;
    for(SpectatorVec::const_iterator it = list.begin(); it != list.end(); ++it)
    {
        if((player = (*it)->getPlayer()))
            player->sendCreatureSquare(target, squareColor);
    }
}

void Game::addAnimatedText(const Position& pos, uint8_t textColor, const std::string& text)
{
    const SpectatorVec& list = getSpectators(pos);
    addAnimatedText(list, pos, textColor, text);
}

void Game::addAnimatedText(const SpectatorVec& list, const Position& pos, uint8_t textColor,
    const std::string& text)
{
    Player* player = NULL;
    for(SpectatorVec::const_iterator it = list.begin(); it != list.end(); ++it)
    {
        if((player = (*it)->getPlayer()))
            player->sendAnimatedText(pos, textColor, text);
    }
}

void Game::addMagicEffect(const Position& pos, uint8_t effect, bool ghostMode/* = false*/)
{
    if(ghostMode)
        return;

    const SpectatorVec& list = getSpectators(pos);
    addMagicEffect(list, pos, effect);
}

void Game::addMagicEffect(const SpectatorVec& list, const Position& pos, uint8_t effect,
    bool ghostMode/* = false*/)
{
    if(ghostMode)
        return;

    Player* player = NULL;
    for(SpectatorVec::const_iterator it = list.begin(); it != list.end(); ++it)
    {
        if((player = (*it)->getPlayer()))
            player->sendMagicEffect(pos, effect);
    }
}

void Game::addDistanceEffect(const Position& fromPos, const Position& toPos, uint8_t effect)
{
    SpectatorVec list;
    getSpectators(list, fromPos, false);
    getSpectators(list, toPos, true);
    addDistanceEffect(list, fromPos, toPos, effect);
}

void Game::addDistanceEffect(const SpectatorVec& list, const Position& fromPos,
    const Position& toPos, uint8_t effect)
{
    Player* player = NULL;
    for(SpectatorVec::const_iterator it = list.begin(); it != list.end(); ++it)
    {
        if((player = (*it)->getPlayer()))
            player->sendDistanceShoot(fromPos, toPos, effect);
    }
}

void Game::startDecay(Item* item)
{
    if(!item || !item->canDecay() || item->getDecaying() == DECAYING_TRUE)
        return;

    if(item->getDuration() > 0)
    {
        item->addRef();
        item->setDecaying(DECAYING_TRUE);
        toDecayItems.push_back(item);
    }
    else
        internalDecayItem(item);
}

void Game::internalDecayItem(Item* item)
{
    const ItemType& it = Item::items.getItemType(item->getID());
    if(it.decayTo)
    {
        Item* newItem = transformItem(item, it.decayTo);
        startDecay(newItem);
    }
    else
    {
        ReturnValue ret = internalRemoveItem(NULL, item);
        if(ret != RET_NOERROR)
            std::clog << "> DEBUG: internalDecayItem failed, error code: " << (int32_t)ret << ", item id: " << item->getID() << std::endl;
    }
}

void Game::checkDecay()
{
    checkDecayEvent = Scheduler::getInstance().addEvent(createSchedulerTask(EVENT_DECAYINTERVAL,
        boost::bind(&Game::checkDecay, this)));

    size_t bucket = (lastBucket + 1) % EVENT_DECAYBUCKETS;
    for(DecayList::iterator it = decayItems[bucket].begin(); it != decayItems[bucket].end();)
    {
        Item* item = *it;
        int32_t decreaseTime = EVENT_DECAYINTERVAL * EVENT_DECAYBUCKETS;
        if(item->getDuration() - decreaseTime < 0)
            decreaseTime = item->getDuration();

        item->decreaseDuration(decreaseTime);
        if(!item->canDecay())
        {
            item->setDecaying(DECAYING_FALSE);
            freeThing(item);
            it = decayItems[bucket].erase(it);
            continue;
        }

        int32_t dur = item->getDuration();
        if(dur <= 0)
        {
            it = decayItems[bucket].erase(it);
            internalDecayItem(item);
            freeThing(item);
        }
        else if(dur < EVENT_DECAYINTERVAL * EVENT_DECAYBUCKETS)
        {
            it = decayItems[bucket].erase(it);
            size_t newBucket = (bucket + ((dur + EVENT_DECAYINTERVAL / 2) / 1000)) % EVENT_DECAYBUCKETS;
            if(newBucket == bucket)
            {
                internalDecayItem(item);
                freeThing(item);
            }
            else
                decayItems[newBucket].push_back(item);
        }
        else
            ++it;
    }

    lastBucket = bucket;
    cleanup();
}

void Game::checkLight()
{
    checkLightEvent = Scheduler::getInstance().addEvent(createSchedulerTask(EVENT_LIGHTINTERVAL,
        boost::bind(&Game::checkLight, this)));

    lightHour = lightHour + lightHourDelta;
    if(lightHour > 1440)
        lightHour = lightHour - 1440;

    if(std::abs(lightHour - SUNRISE) < 2 * lightHourDelta)
        lightState = LIGHT_STATE_SUNRISE;
    else if(std::abs(lightHour - SUNSET) < 2 * lightHourDelta)
        lightState = LIGHT_STATE_SUNSET;

    int32_t newLightLevel = lightLevel;
    bool lightChange = false;
    switch(lightState)
    {
        case LIGHT_STATE_SUNRISE:
        {
            newLightLevel += (LIGHT_LEVEL_DAY - LIGHT_LEVEL_NIGHT) / 30;
            lightChange = true;
            break;
        }
        case LIGHT_STATE_SUNSET:
        {
            newLightLevel -= (LIGHT_LEVEL_DAY - LIGHT_LEVEL_NIGHT) / 30;
            lightChange = true;
            break;
        }
        default:
            break;
    }

    if(newLightLevel <= LIGHT_LEVEL_NIGHT)
    {
        lightLevel = LIGHT_LEVEL_NIGHT;
        lightState = LIGHT_STATE_NIGHT;
    }
    else if(newLightLevel >= LIGHT_LEVEL_DAY)
    {
        lightLevel = LIGHT_LEVEL_DAY;
        lightState = LIGHT_STATE_DAY;
    }
    else
        lightLevel = newLightLevel;

    if(lightChange)
    {
        LightInfo lightInfo;
        getWorldLightInfo(lightInfo);
        for(AutoList<Player>::iterator it = Player::autoList.begin(); it != Player::autoList.end(); ++it)
        {
            if(!it->second->hasCustomFlag(PlayerCustomFlag_HasFullLight))
                it->second->sendWorldLight(lightInfo);
        }
    }
}
#ifdef __WAR_SYSTEM__

void Game::checkWars()
{
    IOGuild::getInstance()->checkWars();
    checkWarsEvent = Scheduler::getInstance().addEvent(createSchedulerTask(EVENT_WARSINTERVAL,
        boost::bind(&Game::checkWars, this)));
}
#endif

void Game::getWorldLightInfo(LightInfo& lightInfo)
{
    lightInfo.level = lightLevel;
    lightInfo.color = 0xD7;
}

Editado por gbik (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Vou tentar, pera :D

 

Funcionou , mas esse e so o da life ne? e o da mana? tem como me passar tbm? kk

bool Game::combatChangeMana(Creature* attacker, Creature* target, int32_t manaChange)

{

    const Position& targetPos = target->getPosition();

    if(manaChange > 0)

    {

        bool deny = false;

        CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);

        for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)

        {

            if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_MANAGAIN, COMBAT_HEALING, manaChange))

                deny = true;

        }

        if(deny)

            return false;

        target->changeMana(manaChange);

        if(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE) && !target->isGhost() &&

            (g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE_MONSTER) || !target->getMonster()))

        {

            char buffer[20];

            sprintf(buffer, "+%d", manaChange);

            const SpectatorVec& list = getSpectators(targetPos);

            addAnimatedText(list, targetPos, COLOR_DARKPURPLE, buffer);

        }

    }

    else

    {

        const SpectatorVec& list = getSpectators(targetPos);

        if(!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR)

        {

            addMagicEffect(list, targetPos, MAGIC_EFFECT_POFF);

            return false;

        }

        int32_t manaLoss = std::min(target->getMana(), -manaChange);

        BlockType_t blockType = target->blockHit(attacker, COMBAT_MANADRAIN, manaLoss);

        if(blockType != BLOCK_NONE)

        {

            addMagicEffect(list, targetPos, MAGIC_EFFECT_POFF);

            return false;

        }

        if(manaLoss > 0)

        {

            bool deny = false;

            CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);

            for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)

            {

                if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_MANALOSS, COMBAT_UNDEFINEDDAMAGE, manaChange))

                    deny = true;

            }

            if(deny)

                return false;

            target->drainMana(attacker, COMBAT_MANADRAIN, manaLoss);

            char buffer[20];

            sprintf(buffer, "%d", manaLoss);

            addAnimatedText(list, targetPos, COLOR_BLUE, buffer);

        }

    }

    return true;

}

void Game::addCreatureHealth(const Creature* target)

{

    const SpectatorVec& list = getSpectators(target->getPosition());

    addCreatureHealth(list, target);

}

void Game::addCreatureHealth(const SpectatorVec& list, const Creature* target)

{

    Player* player = NULL;

    for(SpectatorVec::const_iterator it = list.begin(); it != list.end(); ++it)

    {

        if((player = (*it)->getPlayer()))

            player->sendCreatureHealth(target);

    }

}

void Game::addCreatureSquare(const Creature* target, uint8_t squareColor)

{

    const SpectatorVec& list = getSpectators(target->getPosition());

    addCreatureSquare(list, target, squareColor);

}

void Game::addCreatureSquare(const SpectatorVec& list, const Creature* target, uint8_t squareColor)

{

    Player* player = NULL;

    for(SpectatorVec::const_iterator it = list.begin(); it != list.end(); ++it)

    {

        if((player = (*it)->getPlayer()))

            player->sendCreatureSquare(target, squareColor);

    }

}

void Game::addAnimatedText(const Position& pos, uint8_t textColor, const std::string& text)

{

    const SpectatorVec& list = getSpectators(pos);

    addAnimatedText(list, pos, textColor, text);

}

void Game::addAnimatedText(const SpectatorVec& list, const Position& pos, uint8_t textColor,

    const std::string& text)

{

    Player* player = NULL;

    for(SpectatorVec::const_iterator it = list.begin(); it != list.end(); ++it)

    {

        if((player = (*it)->getPlayer()))

            player->sendAnimatedText(pos, textColor, text);

    }

}

void Game::addMagicEffect(const Position& pos, uint8_t effect, bool ghostMode/* = false*/)

{

    if(ghostMode)

        return;

    const SpectatorVec& list = getSpectators(pos);

    addMagicEffect(list, pos, effect);

}

void Game::addMagicEffect(const SpectatorVec& list, const Position& pos, uint8_t effect,

    bool ghostMode/* = false*/)

{

    if(ghostMode)

        return;

    Player* player = NULL;

    for(SpectatorVec::const_iterator it = list.begin(); it != list.end(); ++it)

    {

        if((player = (*it)->getPlayer()))

            player->sendMagicEffect(pos, effect);

    }

}

void Game::addDistanceEffect(const Position& fromPos, const Position& toPos, uint8_t effect)

{

    SpectatorVec list;

    getSpectators(list, fromPos, false);

    getSpectators(list, toPos, true);

    addDistanceEffect(list, fromPos, toPos, effect);

}

void Game::addDistanceEffect(const SpectatorVec& list, const Position& fromPos,

    const Position& toPos, uint8_t effect)

{

    Player* player = NULL;

    for(SpectatorVec::const_iterator it = list.begin(); it != list.end(); ++it)

    {

        if((player = (*it)->getPlayer()))

            player->sendDistanceShoot(fromPos, toPos, effect);

    }

}

void Game::startDecay(Item* item)

{

    if(!item || !item->canDecay() || item->getDecaying() == DECAYING_TRUE)

        return;

    if(item->getDuration() > 0)

    {

        item->addRef();

        item->setDecaying(DECAYING_TRUE);

        toDecayItems.push_back(item);

    }

    else

        internalDecayItem(item);

}

void Game::internalDecayItem(Item* item)

{

    const ItemType& it = Item::items.getItemType(item->getID());

    if(it.decayTo)

    {

        Item* newItem = transformItem(item, it.decayTo);

        startDecay(newItem);

    }

    else

    {

        ReturnValue ret = internalRemoveItem(NULL, item);

        if(ret != RET_NOERROR)

            std::clog << "> DEBUG: internalDecayItem failed, error code: " << (int32_t)ret << ", item id: " << item->getID() << std::endl;

    }

}

void Game::checkDecay()

{

    checkDecayEvent = Scheduler::getInstance().addEvent(createSchedulerTask(EVENT_DECAYINTERVAL,

        boost::bind(&Game::checkDecay, this)));

    size_t bucket = (lastBucket + 1) % EVENT_DECAYBUCKETS;

    for(DecayList::iterator it = decayItems[bucket].begin(); it != decayItems[bucket].end() ;)

    {

        Item* item = *it;

        int32_t decreaseTime = EVENT_DECAYINTERVAL * EVENT_DECAYBUCKETS;

        if(item->getDuration() - decreaseTime < 0)

            decreaseTime = item->getDuration();

        item->decreaseDuration(decreaseTime);

        if(!item->canDecay())

        {

            item->setDecaying(DECAYING_FALSE);

            freeThing(item);

            it = decayItems[bucket].erase(it);

            continue;

        }

        int32_t dur = item->getDuration();

        if(dur <= 0)

        {

            it = decayItems[bucket].erase(it);

            internalDecayItem(item);

            freeThing(item);

        }

        else if(dur < EVENT_DECAYINTERVAL * EVENT_DECAYBUCKETS)

        {

            it = decayItems[bucket].erase(it);

            size_t newBucket = (bucket + ((dur + EVENT_DECAYINTERVAL / 2) / 1000)) % EVENT_DECAYBUCKETS;

            if(newBucket == bucket)

            {

                internalDecayItem(item);

                freeThing(item);

            }

            else

                decayItems[newBucket].push_back(item);

        }

        else

            ++it;

    }

    lastBucket = bucket;

    cleanup();

}

void Game::checkLight()

{

    checkLightEvent = Scheduler::getInstance().addEvent(createSchedulerTask(EVENT_LIGHTINTERVAL,

        boost::bind(&Game::checkLight, this)));

    lightHour = lightHour + lightHourDelta;

    if(lightHour > 1440)

        lightHour = lightHour - 1440;

    if(std::abs(lightHour - SUNRISE) < 2 * lightHourDelta)

        lightState = LIGHT_STATE_SUNRISE;

    else if(std::abs(lightHour - SUNSET) < 2 * lightHourDelta)

        lightState = LIGHT_STATE_SUNSET;

    int32_t newLightLevel = lightLevel;

    bool lightChange = false;

    switch(lightState)

    {

        case LIGHT_STATE_SUNRISE:

        {

            newLightLevel += (LIGHT_LEVEL_DAY - LIGHT_LEVEL_NIGHT) / 30;

            lightChange = true;

            break;

        }

        case LIGHT_STATE_SUNSET:

        {

            newLightLevel -= (LIGHT_LEVEL_DAY - LIGHT_LEVEL_NIGHT) / 30;

            lightChange = true;

            break;

        }

        default:

            break;

    }

    if(newLightLevel <= LIGHT_LEVEL_NIGHT)

    {

        lightLevel = LIGHT_LEVEL_NIGHT;

        lightState = LIGHT_STATE_NIGHT;

    }

    else if(newLightLevel >= LIGHT_LEVEL_DAY)

    {

        lightLevel = LIGHT_LEVEL_DAY;

        lightState = LIGHT_STATE_DAY;

    }

    else

        lightLevel = newLightLevel;

    if(lightChange)

    {

        LightInfo lightInfo;

        getWorldLightInfo(lightInfo);

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

        {

            if(!it->second->hasCustomFlag(PlayerCustomFlag_HasFullLight))

                it->second->sendWorldLight(lightInfo);

        }

    }

}

#ifdef __WAR_SYSTEM__

void Game::checkWars()

{

    IOGuild::getInstance()->checkWars();

    checkWarsEvent = Scheduler::getInstance().addEvent(createSchedulerTask(EVENT_WARSINTERVAL,

        boost::bind(&Game::checkWars, this)));

}

#endif

void Game::getWorldLightInfo(LightInfo& lightInfo)

{

    lightInfo.level = lightLevel;

    lightInfo.color = 0xD7;

}

 

bool Game::combatChangeMana(Creature* attacker, Creature* target, int32_t manaChange)
{
    const Position& targetPos = target->getPosition();
    if(manaChange > 0)
    {
        bool deny = false;
        CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
        for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsCh angeEvents.end(); ++it)
        {
            if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_MANAGAIN, COMBAT_HEALING, manaChange))
                deny = true;
        }

        if(deny)
            return false;

        if(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE) && !target->isGhost() &&
        (g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE_MONSTER) || !target->getMonster()))
        {
            int32_t realHeal = manaChange;
            if((realHeal + target->getMana()) > target->getMaxMana())
                realHeal = (target->getMaxMana() - target->getMana());
            
            if(realHeal > 0)
            {
                char buffer[20];
                sprintf(buffer, "+%d", realHeal);
                
                const SpectatorVec& list = getSpectators(targetPos);
                addAnimatedText(list, targetPos, COLOR_DARKPURPLE, buffer);
            }
        }
        target->changeMana(manaChange);
    }
    else
    {
        const SpectatorVec& list = getSpectators(targetPos);
        if(!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR)
        {
            addMagicEffect(list, targetPos, MAGIC_EFFECT_POFF);
            return false;
        }

        int32_t manaLoss = std::min(target->getMana(), -manaChange);
        BlockType_t blockType = target->blockHit(attacker, COMBAT_MANADRAIN, manaLoss);
        if(blockType != BLOCK_NONE)
        {
            addMagicEffect(list, targetPos, MAGIC_EFFECT_POFF);
            return false;
        }

        if(manaLoss > 0)
        {
            bool deny = false;
            CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
            for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)
            {
                if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_MANALOSS, COMBAT_UNDEFINEDDAMAGE, manaChange))
                    deny = true;
            }

            if(deny)
                return false;

            target->drainMana(attacker, COMBAT_MANADRAIN, manaLoss);
            char buffer[20];
            sprintf(buffer, "%d", manaLoss);

            addAnimatedText(list, targetPos, COLOR_BLUE, buffer);
        }
    }

    return true;
}

Link para o post
Compartilhar em outros sites

bool Game::combatChangeMana(Creature* attacker, Creature* target, int32_t manaChange)
{
    const Position& targetPos = target->getPosition();
    if(manaChange > 0)
    {
        bool deny = false;
        CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
        for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsCh angeEvents.end(); ++it)
        {
            if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_MANAGAIN, COMBAT_HEALING, manaChange))
                deny = true;
        }

        if(deny)
            return false;

        if(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE) && !target->isGhost() &&
        (g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE_MONSTER) || !target->getMonster()))
        {
            int32_t realHeal = manaChange;
            if((realHeal + target->getMana()) > target->getMaxMana())
                realHeal = (target->getMaxMana() - target->getMana());
            
            if(realHeal > 0)
            {
                char buffer[20];
                sprintf(buffer, "+%d", realHeal);
                
                const SpectatorVec& list = getSpectators(targetPos);
                addAnimatedText(list, targetPos, COLOR_DARKPURPLE, buffer);
            }
        }
        target->changeMana(manaChange);
    }
    else
    {
        const SpectatorVec& list = getSpectators(targetPos);
        if(!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR)
        {
            addMagicEffect(list, targetPos, MAGIC_EFFECT_POFF);
            return false;
        }

        int32_t manaLoss = std::min(target->getMana(), -manaChange);
        BlockType_t blockType = target->blockHit(attacker, COMBAT_MANADRAIN, manaLoss);
        if(blockType != BLOCK_NONE)
        {
            addMagicEffect(list, targetPos, MAGIC_EFFECT_POFF);
            return false;
        }

        if(manaLoss > 0)
        {
            bool deny = false;
            CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
            for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)
            {
                if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_MANALOSS, COMBAT_UNDEFINEDDAMAGE, manaChange))
                    deny = true;
            }

            if(deny)
                return false;

            target->drainMana(attacker, COMBAT_MANADRAIN, manaLoss);
            char buffer[20];
            sprintf(buffer, "%d", manaLoss);

            addAnimatedText(list, targetPos, COLOR_BLUE, buffer);
        }
    }

    return true;
}

Muito Obrigado :)

Mano, qual notepad tu usa? kkk :(

Editado por gbik (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Notepad++

Eu tbm, pq quando eu copio e colo aqui nao fica colorido? xd

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo