![]() |
|
#1
|
|||
|
![]() ah, all i know is it just doesn't feel right. i know takp got their combat formulas from packet captures off the al'kabor server or whatever but i was getting spell interrupted 100% of the time, couldn't even face tank a willowisp in erud's crossing at lvl 16
| ||
|
#2
|
|||
|
![]() ^ sounds like my Wiz experience on classic live; P99 definitely errs a bit too far toward channeling casts, at lower levels at least.
| ||
|
#3
|
||||
|
![]() Quote:
i spent so much time on that island it's like only thing i confidently remember after 23 years and it ez pz by 16 if you don't get a add insert shit's not classic Swish gif here | |||
|
#4
|
||||
|
![]() Quote:
TAKP's channeling logic was based off of a client decompile. (credit to Mackal for the decompile) It's possible the implementation is imperfect but the core logic seems accurate to me, which is this: your chance to channel is a value of channeling skill + player level and it must beat a random number from 1 to 390. There is a minimum 10% chance to channel and there is a bonus if the spell is more than 5 levels under your current level. This roll is done for every hit against you and you must win every roll during the cast. If you get pushed more than 1 unit from your starting position you will interrupt as well. The channeling skill just doesn't work very frequently at low levels. Also if you neglect your defense skill you're gonna have a bad time because that's where your avoidance comes from. (also get at least 75 agi) TAKP's combat formulas don't come from packet sniffing btw. Our combat logic was pieced together from several sources which include a handful of leaks from Sony developers, client decompiles, and shit ton of log parsing on Live servers using many different custom log parsing tools/scripts with some detective work to separate the modern stuff from the old stuff and fitting them all together. Much of it is precise but some of it must be approximated, like NPC statistics. A lot of NPCs were parsed on Live over half a decade for stats. | |||
|
#5
|
||||
|
![]() Quote:
Code:
else if (!spells[spell_id].uninterruptable) // not bard, check movement { // special case - this item can be cast while moving, by any player, not just bards if ((IsClient() && ((slot == CastingSlot::Item)) && inventory_slot != 0xFFFFFFFF) && CastToClient()->GetItemIDAt(inventory_slot) == 28906 /* Bracelet of the Shadow Hive */) { Log(Logs::Detail, Logs::Spells, "Casting from clicky item %s. Allowing cast while moving.", CastToClient()->GetInv()[inventory_slot]->GetItem()->Name); } // if has been attacked, or moved while casting, try to channel else if (attacked_count > 0 || GetX() != GetSpellX() || GetY() != GetSpellY()) { uint16 channel_chance = 0; if (IsClient()) { // this is fairly accurate (but not perfect) and based on decompiles // client is holding down forward movement key or no skill if (animation > 0 || GetSkill(EQ::skills::SkillChanneling) == 0) { InterruptSpell(); return; } float distance_moved, d_x, d_y; if (GetX() != GetSpellX() || GetY() != GetSpellY()) { d_x = std::abs(std::abs(GetX()) - std::abs(GetSpellX())); d_y = std::abs(std::abs(GetY()) - std::abs(GetSpellY())); if (d_x > 1.00001f || d_y > 1.00001f) { InterruptSpell(); return; } } if (attacked_count == 0) attacked_count = 1; uint16 bonus_chance = 0; uint16 spell_level = spells[spell_id].classes[GetClass() - 1]; uint16 roll = 0; uint16 loops = 0; do { roll = zone->random.Int(1, 390); if (!IsFromItem && aabonuses.ChannelChanceSpells) { roll = (100 - aabonuses.ChannelChanceSpells) * roll / 100; } if (GetLevel() > (spell_level + 5)) bonus_chance = 3 * (GetLevel() - spell_level) + 35; channel_chance = GetSkill(EQ::skills::SkillChanneling) + GetLevel() + bonus_chance; if (channel_chance > 370) channel_chance = 370; Log(Logs::Detail, Logs::Spells, "Checking Interruption: spell x: %f spell y: %f cur x: %f cur y: %f channelchance %f channeling skill %d\n", GetSpellX(), GetSpellY(), GetX(), GetY(), channel_chance, GetSkill(EQ::skills::SkillChanneling)); if (roll > channel_chance && roll >= 39) { Log(Logs::Detail, Logs::Spells, "Casting of %d canceled: interrupted.", spell_id); InterruptSpell(SPELL_UNKNOWN, true); return; } loops++; } while (loops < attacked_count); regain_conc = true; } else { // NPCs don't use channeling skill (says Rashere circa 2006) or fail spells from push // this is an extremely crude approximation but based on AK log greps of a handful of NPCs // hit NPCs typically don't even regain concentration and just finish casts int roll = 30; if (GetLevel() > 70) roll = 10; else if (GetLevel() > 30) roll = 20; // this spell id range is hardcoded to not be interruptable. // this was determined from a client decompile. credit: Mackal if (IsNPC() && spell_id >= 859 && spell_id <= 1023) roll = 0; if (zone->random.Roll(roll)) { // caster NPCs have an extremely high regains rate; almost 100% at high levels roll = zone->random.Int(1, 390); // AK logs show some warrior NPCs (e.g. Tallon Zek) not regaining concentration; maybe NPCs used channeling skill in 2002 but not 2006? shrug if (GetClass() == WARRIOR || GetClass() == ROGUE || GetClass() == MONK) roll = 0; if (roll > ((GetLevel() < 51 ? 325 : 225) - GetLevel() * 3)) // not how Sony did it; replace this if you find data/evidence/leaks regain_conc = true; else { Log(Logs::Detail, Logs::Spells, "Casting of %d canceled: interrupted.", spell_id); InterruptSpell(SPELL_UNKNOWN, true); return; } } } if (regain_conc) { Message_StringID(CC_User_Spells, REGAIN_AND_CONTINUE); uint16 textcolor = IsNPC() ? CC_User_Default : CC_User_Spells; entity_list.MessageClose_StringID(this, true, 200, textcolor, OTHER_REGAIN_CAST, this->GetCleanName()); } } // mob was hit or moved from start of cast loc } // class != bard You should see the amount of stuff Torven had to go through to make sure this information was all correct. This is mostly a case of EQ actually being this hard in classic, but people wanting it to feel a specific way. P99 is full of inaccuracies that basically give you the feel of classic, though arguably their content / zone populations are much better at least for classic. (for now.)
__________________
Engineer of Things and Stuff, Wearer of Many Hats
“Knowing yourself is the beginning of all wisdom.” — Aristotle | |||
|
#6
|
|||
|
![]() open source is the only ethical way to rip off someone else's content like p99 has done to daybreak. Why haven't they gone open source so bugs would actually get fixed?
| ||
|
#7
|
|||
|
![]() I seen over-moderation slowly kill off many third party servers, from tribes2 to WoW.
| ||
|
#8
|
||||
|
![]() Quote:
Got it. | |||
|
#9
|
|||
|
![]() Can play on PC or must be mac?
__________________
| ||
|
#10
|
|||
|
![]() Also, manastone in at launch or nah? This is obvs the deciding factor.
A Macintosh can be bought. A manastone cannot.
__________________
| ||
|
![]() |
|
|