Hi zusammen,
damals musste man beim leveln konstant die Pott-Taste drücken um nicht vom Pferd zu fallen. Dann kam der automatische Pott aus dem Itemshop. Ich finde es bis heute komisch die ganze Zeit potten zu müssen, darum zeige ich nun hier eine Möglichkeit um die TP-Regeneration so zu erhöhen, dass sowohl Leveln ohne Potts, als auch Duelle gut möglich sind.
Wir müssen dafür die char.cpp bearbeiten (game/src/char.cpp im Server Sourcecode)
-
Suchen: if (ch->IsAffectFlag(AFF_POISON) == true)
Darunter auskommentieren: return 3; -
Suchen: if (ch->GetMaxHP() <= ch->GetHP())
Darunter ist: return PASSES_PER_SEC(3);
Ersetzen mit: return PASSES_PER_SEC(1); - Suchen: iAmount += (iAmount * ch->GetPoint(POINT_HP_REGEN)) / 100;
Ersetzen mit: iAmount += ((iAmount * 120) + (iAmount * ch->GetPoint(POINT_HP_REGEN))) / 100; - Unter 3. suchen: return PASSES_PER_SEC(3);
Ersetzen mit: return PASSES_PER_SEC(1) -
Suchen: int iSec = IsPC() ? 3 : (MAX(1, GetMobTable().bRegenCycle));
Ersetzen mit: int iSec = IsPC() ? 1 : (MAX(1, GetMobTable().bRegenCycle));
Um die Menge der Regenerierten TP pro Sekunde anzupassen verändert ihr am besten den Wert 120 aus Punkt 3.
Hier noch einmal die zwei betroffenen Funktionen komplett, aber beachtet das euer Sourcecode eventuell abweichen kann. Ich benutze hier die Fliege Files (Reworked):
C
- EVENTFUNC(recovery_event)
- {
- char_event_info* info = dynamic_cast<char_event_info*>( event->info );
- if ( info == NULL )
- {
- sys_err( "recovery_event> <Factor> Null pointer" );
- return 0;
- }
- LPCHARACTER ch = info->ch;
- if (ch == NULL) { // <Factor>
- return 0;
- }
- if (!ch->IsPC())
- {
- //
- // ¸ó½ºÅÍ È¸º¹
- //
- if (ch->IsAffectFlag(AFF_POISON))
- return PASSES_PER_SEC(MAX(1, ch->GetMobTable().bRegenCycle));
- if (2493 == ch->GetMobTable().dwVnum)
- {
- int regenPct = BlueDragon_GetRangeFactor("hp_regen", ch->GetHPPct());
- regenPct += ch->GetMobTable().bRegenPercent;
- for (int i=1 ; i <= 4 ; ++i)
- {
- if (REGEN_PECT_BONUS == BlueDragon_GetIndexFactor("DragonStone", i, "effect_type"))
- {
- DWORD dwDragonStoneID = BlueDragon_GetIndexFactor("DragonStone", i, "vnum");
- size_t val = BlueDragon_GetIndexFactor("DragonStone", i, "val");
- size_t cnt = SECTREE_MANAGER::instance().GetMonsterCountInMap( ch->GetMapIndex(), dwDragonStoneID );
- regenPct += (val*cnt);
- break;
- }
- }
- ch->PointChange(POINT_HP, MAX(1, (ch->GetMaxHP() * regenPct) / 100));
- }
- else if (!ch->IsDoor())
- {
- ch->MonsterLog("HP_REGEN +%d", MAX(1, (ch->GetMaxHP() * ch->GetMobTable().bRegenPercent) / 100));
- ch->PointChange(POINT_HP, MAX(1, (ch->GetMaxHP() * ch->GetMobTable().bRegenPercent) / 100));
- }
- if (ch->GetHP() >= ch->GetMaxHP())
- {
- ch->m_pkRecoveryEvent = NULL;
- return 0;
- }
- if (2493 == ch->GetMobTable().dwVnum)
- {
- for (int i=1 ; i <= 4 ; ++i)
- {
- if (REGEN_TIME_BONUS == BlueDragon_GetIndexFactor("DragonStone", i, "effect_type"))
- {
- DWORD dwDragonStoneID = BlueDragon_GetIndexFactor("DragonStone", i, "vnum");
- size_t val = BlueDragon_GetIndexFactor("DragonStone", i, "val");
- size_t cnt = SECTREE_MANAGER::instance().GetMonsterCountInMap( ch->GetMapIndex(), dwDragonStoneID );
- return PASSES_PER_SEC(MAX(1, (ch->GetMobTable().bRegenCycle - (val*cnt))));
- }
- }
- }
- return PASSES_PER_SEC(MAX(1, ch->GetMobTable().bRegenCycle));
- }
- else
- {
- //
- // PC ȸº¹
- //
- ch->CheckTarget();
- //ch->UpdateSectree(); // ¿©±â¼ ÀÌ°É ¿ÖÇÏÁö?
- ch->UpdateKillerMode();
- if (ch->IsAffectFlag(AFF_POISON) == true)
- {
- // Áßµ¶ÀÎ °æ¿ì ÀÚµ¿È¸º¹ ±ÝÁö
- // ÆĹý¼úÀÎ °æ¿ì ÀÚµ¿È¸º¹ ±ÝÁö
- //do not return here, because this would stop our tp reg
- //return 3;
- }
- int iSec = (get_dword_time() - ch->GetLastMoveTime()) / 3000;
- // SP ȸº¹ ·çƾ.
- // ¿Ö ÀÌ°É·Î Çؼ ÇÔ¼ö·Î »©³ù´Â°¡ ?!
- ch->DistributeSP(ch);
- if (ch->GetMaxHP() <= ch->GetHP())
- {
- //faster tp reg interval
- //return PASSES_PER_SEC(3);
- return PASSES_PER_SEC(1);
- }
- int iPercent = 0;
- int iAmount = 0;
- {
- iPercent = aiRecoveryPercents[MIN(9, iSec)];
- iAmount = 15 + (ch->GetMaxHP() * iPercent) / 100;
- }
- //more base tp reg per tick (POINT_HP_REGEN + stays the same)
- //iAmount += (iAmount * ch->GetPoint(POINT_HP_REGEN)) / 100;
- iAmount += ((iAmount * 120) + (iAmount * ch->GetPoint(POINT_HP_REGEN))) / 100;
- sys_log(1, "RECOVERY_EVENT: %s %d HP_REGEN %d HP +%d", ch->GetName(), iPercent, ch->GetPoint(POINT_HP_REGEN), iAmount);
- ch->PointChange(POINT_HP, iAmount, false);
- //faster tp reg interval
- //return PASSES_PER_SEC(3);
- return PASSES_PER_SEC(1);
- }
- }
- void CHARACTER::StartRecoveryEvent()
- {
- if (m_pkRecoveryEvent)
- return;
- if (IsDead() || IsStun())
- return;
- if (IsNPC() && GetHP() >= GetMaxHP()) // ¸ó½ºÅʹ ü·ÂÀÌ ´Ù Â÷ÀÖÀ¸¸é ½ÃÀÛ ¾ÈÇÑ´Ù.
- return;
- char_event_info* info = AllocEventInfo<char_event_info>();
- info->ch = this;
- //faster tp reg interval
- //int iSec = IsPC() ? 3 : (MAX(1, GetMobTable().bRegenCycle));
- int iSec = IsPC() ? 1 : (MAX(1, GetMobTable().bRegenCycle));
- m_pkRecoveryEvent = event_create(recovery_event, info, PASSES_PER_SEC(iSec));
- }