|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Archive::Development Archive area for Development's posts that were moved here after an inactivity period of 90 days. |
|
|
|
08-01-2004, 02:41 PM
|
Sarnak
|
|
Join Date: May 2004
Posts: 58
|
|
Random fixes
hi, ive kinda made it a goal of mine to fix AA as a means of learning to program, im posting so that anyone else thats been working on them as well may post their progress so i dont have to do something thats already been done, and so that others may notice problems in what ive corrected so far.
anyway ive corrected quite a few but i need some help on the more complex ones such as wake the dead and doppelganger, so im hoping someone else may have already made some progress on those or others and would like to share.
also let me say sorry for deleting the exsisting comments in eq_packet_structs.h as ive been useing that as a checklist of sorta, also while working with these i discovered a tons of little errors and exploits, the biggest of which were that the entire AA table was off by one so checks for innate STA were actually checking innate STR, also with the way AA were set up i found a huge exploit allowing any character to have any AA skill at any time, thats been corrected however another huge problem is that the AA timers dont seem to be working at all, so i need to ask if they ever were to begin with or maybe my database or something ive done has broken them, these all work with the latest CVS 07-31-04 and the latest spells_us.txt from sony, although some of the spells themselves arent correct so druid dire charm does not check if the target is an animal, can correct this in your own spells_us.txt or ill eventually do it in the code for the skill itself i guess.
PROS- most targeted AAs work, if your database is setup correctly with the correct max level and the cost of the FIRST purchase of a skill the buy ammount is correct in that it doubles when needed 2-4-6 etc, i fixed the exploit i found. i also threw in the timer mods for skill reuse AAs, and i put in a message to client for my own testing purposes so youll have to delete those as needed
CONS- THIS WILL DELETE ALL EXSISTING AA SKILLS AND POINTS FROM ALL CHARACTERS on your server, and none are really usefull to legit servers since currently the AA timer is not working, for me atleast
uhh also im not sure how to post all this without it useing word wrap or whatever so this might be messy but oh well...
zone\command.cpp around line 4748
replace exsisintg with-
Code:
void command_manaburn(Client *c, const Seperator *sep)
{
Mob* target=c->GetTarget();
if (c->GetTarget() == 0)
c->Message(0, "#Manaburn needs a target.");
else {
int cur_level=c->GetAAStruct()->god_ability.named.mana_burn;
if (c->DistNoRootNoZ(*target) > 200)
c->Message(0,"You are too far away from your target.");
else {
if(cur_level == 1) {
if(c->IsAttackAllowed(target))
{
int nukedmg=(c->GetMana())*2;
if (nukedmg>0)
{
target->Damage(c, nukedmg, 2751,240);
c->SetMana(0);
}
LogFile->write(EQEMuLog::Normal,"Manaburn request from %s, damage: %d", c->GetName(), nukedmg);
}
}
else
c->Message(0, "You have not learned this skill.");
}
}
}
common\eq_packet_structs.h around line 3142
replace exsisintg with-
Code:
// New Alternate Advancement table. holds all the skill levels for the AA skills.
// Length: 309 Bytes
// OpCode: 1422
struct PlayerAA_Struct {
/* 0 */ uint8 unknown0;
union {
uint8 unnamed[17];
struct {
/* 1 */ uint8 innate_strength; //works
/* 2 */ uint8 innate_stamina; //works
/* 3 */ uint8 innate_agility; //works
/* 4 */ uint8 innate_dexterity; //works
/* 5 */ uint8 innate_intelligence; //works
/* 6 */ uint8 innate_wisdom; //works
/* 7 */ uint8 innate_charisma; //works
/* 8 */ uint8 innate_fire_protection; //works
/* 9 */ uint8 innate_cold_protection; //works
/* 10 */ uint8 innate_magic_protection; //works
/* 11 */ uint8 innate_poison_protection; //works
/* 12 */ uint8 innate_disease_protection; //works
/* 13 */ uint8 innate_run_speed; //works, 3 levs
/* 14 */ uint8 unknown14; //was regeneration
/* 15 */ uint8 innate_metabolism; //dont know, 3 levs
/* 16 */ uint8 innate_lung_capacity; //dont know, 3 levs
/* 17 */ uint8 first_aid; //dont know, 3 levs
} named;
} general_skills;
union {
uint8 unnamed[17];
struct {
/* 18 */ uint8 healing_adept; //works
/* 19 */ uint8 healing_gift; //works
/* 20 */ uint8 spell_casting_mastery; //dont know,
/* 21 */ uint8 spell_casting_reinforcement; //dont know,
/* 22 */ uint8 unknown22; //was mental clarity
/* 23 */ uint8 spell_casting_fury; //works
/* 24 */ uint8 chanelling_focus; //dont know,
/* 25 */ uint8 spell_casting_subtlety; //dont know,
/* 26 */ uint8 spell_casting_expertise; //dont know,
/* 27 */ uint8 spell_casting_deftness; //works
/* 28 */ uint8 natural_durability; //works
/* 29 */ uint8 natural_healing; //works
/* 30 */ uint8 combat_fury; //dont know,
/* 31 */ uint8 fear_resistance; //works
/* 32 */ uint8 finishing_blow; //dont know,
/* 33 */ uint8 combat_stability; //dont know,
/* 34 */ uint8 combat_agility; //dont know,
} named;
} archetype_skills;
union {
uint8 unnamed[94];
struct {
/* 35 */ uint8 mass_group_buff; //works lil off
// ===== Cleric =====
/* 36 */ uint8 divine_resurrection; //works
/* 37 */ uint8 innate_invis_to_undead; //works
/* 38 */ uint8 celestial_regeneration; //works
/* 39 */ uint8 bestow_divine_aura; //works
/* 40 */ uint8 turn_undead; //Spell Buggy
/* 41 */ uint8 purify_soul; //works but buggy
// ===== Druid =====
/* 42 */ uint8 quick_evacuation; //works
/* 43 */ uint8 exodus; //works
/* 44 */ uint8 quick_damage; //works
/* 45 */ uint8 enhanced_root; //dont know
/* 46 */ uint8 dire_charm; //works lil off
// ===== Shaman =====
/* 47 */ uint8 cannibalization; //works
/* 48 */ uint8 quick_buff; //dont know, 3 levs
/* 49 */ uint8 alchemy_mastery; //dont know
/* 50 */ uint8 rabid_bear; //works
// ===== Wizard =====
/* 51 */ uint8 unknown51; //used to be manaburn
/* 52 */ uint8 improved_familiar; //works
/* 53 */ uint8 nexus_gate; //works
// ===== Enchanter =====
/* 54 */ uint8 unknown54;
/* 55 */ uint8 permanent_illusion; //dont know
/* 56 */ uint8 jewel_craft_mastery; //dont know, 3 levs
/* 57 */ uint8 gather_mana; //works
// ===== Mage =====
/* 58 */ uint8 mend_companion; //Works
/* 59 */ uint8 quick_summoning; //dont know
/* 60 */ uint8 frenzied_burnout; //not working-spell buggy
/* 61 */ uint8 elemental_form_fire; //Works
/* 62 */ uint8 elemental_form_water; //Works
/* 63 */ uint8 elemental_form_earth; //Works
/* 64 */ uint8 elemental_form_air; //Works
/* 65 */ uint8 unknown65; //was improved reclaim energy
/* 66 */ uint8 turn_summoned; //Spell Buggy
/* 67 */ uint8 elemental_pact; //dont know
// ===== Necromancer =====
/* 68 */ uint8 life_burn; //works
/* 69 */ uint8 dead_mesmerization; //dont know
/* 70 */ uint8 fearstorm; //works
/* 71 */ uint8 flesh_to_bone; //not working
/* 72 */ uint8 call_to_corpse; //works but self only
// ===== Paladin =====
/* 73 */ uint8 divine_stun; //works
/* 74 */ uint8 improved_lay_of_hands; //dont know
/* 75 */ uint8 slay_undead; //dont know, 3 levs
/* 76 */ uint8 act_of_valor; //works
/* 77 */ uint8 holy_steed; //works but default fast horse
/* 78 */ uint8 fearless; //works
/* 79 */ uint8 two_hand_bash; //dont know
// ===== Ranger =====
/* 80 */ uint8 innate_camouflage; //works
/* 81 */ uint8 ambidexterity; //works
/* 82 */ uint8 archery_mastery; //works
/* 83 */ uint8 unknown83;
/* 84 */ uint8 endless_quiver; //works
// ===== Shadow Knight =====
/* 85 */ uint8 unholy_steed; //works but just a default fast horse~
/* 86 */ uint8 improved_harm_touch; //dont know, can fix
/* 87 */ uint8 leech_touch; //works
/* 88 */ uint8 unknown88;
/* 89 */ uint8 soul_abrasion; //works
// ===== Bard =====
/* 90 */ uint8 instrument_mastery; //dont know, 3 levs
/* 91 */ uint8 unknown91;
/* 92 */ uint8 unknown92;
/* 93 */ uint8 unknown93;
/* 94 */ uint8 jam_fest; //dont know, 3 levs
/* 95 */ uint8 unknown95;
/* 96 */ uint8 unknown96;
// ===== Monk =====
/* 97 */ uint8 critical_mend; //dont know, 3 levs
/* 98 */ uint8 purify_body; //dont know
/* 99 */ uint8 unknown99;
/* 100 */ uint8 rapid_feign; //dont know, 3 levs
/* 101 */ uint8 return_kick; //dont know, 3 levs
// ===== Rogue =====
/* 102 */ uint8 escape; //works
/* 103 */ uint8 poison_mastery; //dont know, 3 levs
/* 104 */ uint8 double_riposte; //dont know, 3 levs
/* 105 */ uint8 unknown105;
/* 106 */ uint8 unknown106;
/* 107 */ uint8 purge_poison; //works
// ===== Warrior =====
/* 108 */ uint8 flurry; //works
/* 109 */ uint8 rampage; //works
/* 110 */ uint8 area_taunt; //works
/* 111 */ uint8 warcry; //spell error
/* 112 */ uint8 bandage_wound; //dont know, 3 levs
// ===== (Other) =====
/* 113 */ uint8 spell_casting_reinforcement_mastery; //dont know
/* 114 */ uint8 spell_casting_fury_mastery; //works
/* 115 */ uint8 unknown115; //was extended notes
/* 116 */ uint8 dragon_punch; //dont know
/* 117 */ uint8 strong_root; //works
/* 118 */ uint8 singing_mastery; //dont know, 3 levs
/* 119 */ uint8 body_and_mind_rejuvenation; //not working
/* 120 */ uint8 physical_enhancement; //dont know
/* 121 */ uint8 adv_trap_negotiation; //dont know, 3 levs
/* 122 */ uint8 acrobatics; //dont know, 3 levs
/* 123 */ uint8 scribble_notes; //dont know
/* 124 */ uint8 chaotic_stab; //dont know
/* 125 */ uint8 pet_discipline; //not working
/* 126 */ uint8 hobble_of_spirits; //works
/* 127 */ uint8 frenzy_of_spirit; //works
/* 128 */ uint8 paragon_of_spirit; //works
} named;
} class_skills;
union {
uint8 unnamed[15];
struct {
/* 129 */ uint8 advanced_innate_strength; //works
/* 130 */ uint8 advanced_innate_stamina; //works
/* 131 */ uint8 advanced_innate_agility; //works
/* 132 */ uint8 advanced_innate_dexterity; //works
/* 133 */ uint8 advanced_innate_intelligence; //works
/* 134 */ uint8 advanced_innate_wisdom; //works
/* 135 */ uint8 advanced_innate_charisma; //works
/* 136 */ uint8 warding_of_solusek; //works
/* 137 */ uint8 blessing_of_eci; //works
/* 138 */ uint8 marrs_protection; //works
/* 139 */ uint8 shroud_of_the_faceless; //works
/* 140 */ uint8 bertoxxulous_gift; //works
/* 141 */ uint8 new_tanaan_crafting_mastery; //dont know
/* 142 */ uint8 planar_power; //works
/* 143 */ uint8 planar_durability; //works
} named;
} pop_advance;
union {
uint8 unnamed[77];
struct {
/* 144 */ uint8 innate_enlightenment; //works
/* 145 */ uint8 unknown145;
/* 146 */ uint8 advanced_healing_adept; //works
/* 147 */ uint8 advanced_healing_gift; //works
/* 148 */ uint8 coup_de_grace; //dont know, 3 levs
/* 149 */ uint8 fury_of_the_ages; //dont know, 3 levs
/* 150 */ uint8 mastery_of_the_past; //dont know, 3 levs
/* 151 */ uint8 lightning_reflexes; //dont know, 5 levs
/* 152 */ uint8 innate_defense; //dont know, 5 levs
/* 153 */ uint8 radiant_cure; //Works spell buggy
/* 154 */ uint8 hastened_divinity; //Works
/* 155 */ uint8 hastened_turning; //Works
/* 156 */ uint8 hastened_purification_of_the_soul; //Works
/* 157 */ uint8 hastened_gathering; //Works
/* 158 */ uint8 hastened_rabidity; //works
/* 159 */ uint8 hastened_exodus; //works
/* 160 */ uint8 hastened_root; //works
/* 161 */ uint8 hastened_mending; //Works
/* 162 */ uint8 hastened_banishment; //Works
/* 163 */ uint8 hastened_instigation; //Works
/* 164 */ uint8 furious_rampage; //Works
/* 165 */ uint8 hastened_purification_of_the_body; //works
/* 166 */ uint8 hasty_exit; //works
/* 167 */ uint8 hastened_purification; //works
/* 168 */ uint8 flash_of_steel; //dont know, 3 levs, addon buff
/* 169 */ uint8 divine_arbitration; //spell error
/* 170 */ uint8 wrath_of_the_wild; //works
/* 171 */ uint8 virulent_paralysis; //works
/* 172 */ uint8 harvest_of_druzzil; //works
/* 173 */ uint8 eldritch_rune; //Works
/* 174 */ uint8 servant_of_ro; //works
/* 175 */ uint8 wake_the_dead; //works
/* 176 */ uint8 suspended_minion; //Spell errors
/* 177 */ uint8 spirit_call; //works
/* 178 */ uint8 celestial_renewal; //Works
/* 179 */ uint8 allegiant_familiar; //works
/* 180 */ uint8 hand_of_piety; //works
/* 181 */ uint8 mithaniels_binding; //dont know, 2 levs
/* 182 */ uint8 mending_of_the_tranquil; //dont know, 3 levs
/* 183 */ uint8 raging_flurry; //dont know, 3 levs, addon buff
/* 184 */ uint8 guardian_of_the_forest; //works
/* 185 */ uint8 spirit_of_the_wood; //works
/* 186 */ uint8 bestial_frenzy; //dont know, 5 levs
/* 187 */ uint8 harmonious_attack; //dont know, 5 levs
/* 188 */ uint8 knights_advantage; //dont know, 3 levs
/* 189 */ uint8 ferocity; //dont know, 3 levs
/* 190 */ uint8 viscid_roots; //dont know
/* 191 */ uint8 unknown191;
/* 192 */ uint8 ayonaes_tutelage; //dont know, 3 levs
/* 193 */ uint8 feigned_minion; //dont know, 3 levs
/* 194 */ uint8 unfailing_divinity; //dont know, 3 levs
/* 195 */ uint8 animation_empathy; //dont know, 3 levs
/* 196 */ uint8 rush_to_judgment; //works
/* 197 */ uint8 living_shield; //dont know, 3 levs, disc reuse buff
/* 198 */ uint8 consumption_of_the_soul; //dont know, 3 levs, addon
/* 199 */ uint8 boastful_bellow; //works
/* 200 */ uint8 fervent_blessing; //dont know, 3 levs, reuse skill 12 minutes each
/* 201 */ uint8 touch_of_the_wicked; //dont know, 3 levs, reuse buff 12 minutes each
/* 202 */ uint8 punishing_blade; //dont know, 3 levs
/* 203 */ uint8 speed_of_the_knight; //dont know, 3 levs
/* 204 */ uint8 shround_of_stealth; //dont know
/* 205 */ uint8 nimble_evasion; //dont know, 5 levs
/* 206 */ uint8 technique_of_master_wu; //dont know, 5 levs
/* 207 */ uint8 host_of_the_elements; //works
/* 208 */ uint8 call_of_xuzl; //works
/* 209 */ uint8 hastened_stealth; //works
/* 210 */ uint8 ingenuity; //dont know, 3 levs
/* 211 */ uint8 fleet_of_foot; //dont know, 2 levs
/* 212 */ uint8 fading_memories; //works
/* 213 */ uint8 tactical_mastery; //dont know, 3 levs
/* 214 */ uint8 theft_of_life; //works
/* 215 */ uint8 fury_of_magic; //works cleric
/* 216 */ uint8 fury_of_magic_mastery; //works
/* 217 */ uint8 project_illusion; //spell error
/* 218 */ uint8 headshot; //works
/* 219 */ uint8 entrap; //works
/* 220 */ uint8 unholy_touch; //dont know, 3 levs, addon
} named;
} pop_ability;
union {
uint8 unnamed[89];
struct {
/* 221 */ uint8 total_domination; //dont know, 3 levs
/* 222 */ uint8 stalwart_endurance; //dont know, 3 levs
/* 223 */ uint8 quick_summoning; //dont know, 3 levs
/* 224 */ uint8 mental_clarity; //not working, 3 levs
/* 225 */ uint8 innate_regeneration; //works
/* 226 */ uint8 mana_burn; //works
/* 227 */ uint8 extended_notes; //dont know, 3 levs
/* 228 */ uint8 sionachies_crescendo; //dont know, 3 levs
/* 229 */ uint8 improved_reclaim_energy; //dont know
/* 230 */ uint8 swift_journey; //dont know, 2 levs
/* 231 */ uint8 convalescence; //dont know, 2 levs
/* 232 */ uint8 lasting_breath; //dont know, 2 levs
/* 233 */ uint8 packrat; //dont know
/* 234 */ uint8 heightened_endurance; //dont know, 3 levs
/* 235 */ uint8 weapon_affinity; //dont know, 5 levs
/* 236 */ uint8 secondary_forte; //dont know
/* 237 */ uint8 persistent_casting; //dont know, 3 levs
/* 238 */ uint8 tune_of_pursuance; //dont know, 5 levs
/* 239 */ uint8 improved_instrument_mastery; //dont know
/* 240 */ uint8 improved_singing_mastery; //dont know
/* 241 */ uint8 exultant_bellowing; //dont know, 5 levs
/* 242 */ uint8 echo_of_taelosia; //dont know, 3 levs
/* 243 */ uint8 internal_metronome; //dont know, 5 levs
/* 244 */ uint8 pious_supplication; //dont know, 3 levs, addon
/* 245 */ uint8 bestial_alignment; //dont know, 3 levs, spell error
/* 246 */ uint8 wrath_of_xuzl; //works need to add button
/* 247 */ uint8 feral_swipe; //spell error
/* 248 */ uint8 warders_fury; //dont know, 5 levs
/* 249 */ uint8 warders_alacrity; //dont know, 5 levs
/* 250 */ uint8 pet_affinity; //dont know
/* 251 */ uint8 mastery_of_the_past; //dont know, 3 levs, beastlord only?
/* 252 */ uint8 spell_casting_subtlety; //dont know, 3 levs
/* 253 */ uint8 touch_of_the_divine; //dont know, 5 levs
/* 254 */ uint8 divine_avatar; //need to implement
/* 255 */ uint8 exquisite_benediction; //need to implement
/* 256 */ uint8 quickened_curing; //Works
/* 257 */ uint8 natures_boon; //need to implement
/* 258 */ uint8 advanced_tracking; //dont know, 5 levs
/* 259 */ uint8 critical_affliction; //dont know, 3 levs
/* 260 */ uint8 fury_of_magic_mastery; //works
/* 261 */ uint8 doppelganger; //works- lil off
/* 262 */ uint8 enhanced_forgetfulness; //dont know, 5 levs
/* 263 */ uint8 mesmerization_mastery; //dont know
/* 264 */ uint8 quick_mass_group_buff; //Works
/* 265 */ uint8 shared_health; //Not Working
/* 266 */ uint8 elemental_fury; //dont know, 5 levs
/* 267 */ uint8 elemental_alacrity; //dont know, 5 levs
/* 268 */ uint8 elemental_agility; //dont know, 3 levs
/* 269 */ uint8 elemental_durability; //dont know, 3 levs
/* 270 */ uint8 sinister_strikes; //dont know, addon
/* 271 */ uint8 strikethrough; //dont know, 3 levs
/* 272 */ uint8 stonewall; //dont know, 5 levs
/* 273 */ uint8 rapid_strikes; //dont know, 5 levs
/* 274 */ uint8 kick_mastery; //dont know, 3 levs
/* 275 */ uint8 heightened_awareness; //dont know, 5 levs
/* 276 */ uint8 destructive_force; //dont know, 3 levs
/* 277 */ uint8 swarm_of_decay; //works- lil off
/* 278 */ uint8 deaths_fury; //dont know, 5 levs
/* 279 */ uint8 quickening_of_death; //dont know, 5 levs
/* 280 */ uint8 advanced_theft_of_life; //need to implement, 2 levs
/* 281 */ uint8 triple_backstab; //dont know, 3 levs
/* 282 */ uint8 hastened_piety; //works
/* 283 */ uint8 immobilizing_bash; //dont know, 3 levs
/* 284 */ uint8 vicious_smash; //dont know, 5 levs
/* 285 */ uint8 radiant_cure; //spell errors
/* 286 */ uint8 purification; //spell error
/* 287 */ uint8 precision_of_the_pathfinder; //dont know, 3 levs
/* 288 */ uint8 coat_of_thistles; //dont know, 5 levs
/* 289 */ uint8 flaming_arrows; //not working
/* 290 */ uint8 frost_arrows; //not working
/* 291 */ uint8 seized_opportunity; //dont know, 3 levs
/* 292 */ uint8 trap_circumvention; //dont know, 5 levs
/* 293 */ uint8 improved_hasty_exit; //works
/* 294 */ uint8 virulent_venom; //dont know, 5 levs
/* 295 */ uint8 improved_consumption_of_the_soul; //dont know, 2 levs, addon
/* 296 */ uint8 intense_hatred; //dont know, 5 levs
/* 297 */ uint8 advanced_spirit_call; //works needs button
/* 298 */ uint8 call_of_the_ancients; //needs implemented
/* 299 */ uint8 sturdiness; //dont know, 5 levs
/* 300 */ uint8 warlords_tenacity; //works
/* 301 */ uint8 strengthened_strike; //dont know, 3 levs
/* 302 */ uint8 extended_shielding; //dont know, 3 levs
/* 303 */ uint8 ros_flaming_familiar; //spell error
/* 304 */ uint8 ecis_icy_familiar; //spell error
/* 305 */ uint8 druzzils_mystical_familiar; //spell error
/* 306 */ uint8 advanced_fury_of_magic_mastery;//works
/* 307 */ uint8 ward_of_destruction; //needs implemented
/* 308 */ uint8 frenzied_devastation; //not working 3 levs, spell error
/* 309 */ uint8 unknown309;
} named;
} god_ability;
};
zone\client.cpp around line 3264
replace exsisintg with-
Code:
void Client::ActivateAA(int activate){
int32 timermod=0;
Mob *target=CastToClient()->GetTarget();
Mob *c=CastToClient();
int ct=CastToClient()->GetID();
int targ;
switch(activate){
case 35: //MGB---AE cast group spell in slot 1
{
targ=ct;
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.mass_group_buff;
if(cur_level == 1)
{
CastToClient()->Message(0,"Casting Spell in Slot 1 as an Area Effect");
int spell=m_pp.mem_spells[0];
if((IsGroupSpell(spell))&&(!IsEffectInSpell(spell,SE_Gate))&&
(!IsEffectInSpell(spell, SE_Translocate))&&(!IsEffectInSpell(spell, SE_Teleport))
&&(!IsEffectInSpell(spell, SE_Succor)))
{
int mana;
mana = spells[spell].mana;
mana = (GetActSpellCost(spell, mana))*2;
if(c->GetMana() >= mana)
{
int newmana=(c->GetMana() - mana);
entity_list.AESpell(c,c,100,spell);
c->CastSpell(spell,ct,9,0,0,0,0);
c->SetMana(newmana);
}
else
{
c->Message(13,"Insufficient Mana to cast this Spell.");
break;
}
}
else
{
c->Message(0,"MGB only works with Group Buffs!");
break;
}
int usemod=CastToClient()->GetAAStruct()->god_ability.named.quick_mass_group_buff;
int time;
if(usemod == 1){time=3888;}
else if(usemod == 2){time=3456;}
else if(usemod == 3){time=3024;}
else{time=4320;}
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 36: //divine rezz
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.divine_resurrection;
if(cur_level == 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastSpell(2738,targ,9,0,0,0,0);
timermod=64800;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 37: //innate ivu
{
targ=ct;
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.innate_invis_to_undead;
if(cur_level == 1)
{
CastSpell(2739,targ,9,0,0,0,0);
timermod=7;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 38: //celest regen
{
targ=ct;
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.celestial_regeneration;
if(cur_level == 1)
{
int mod=CastToClient()->GetAAStruct()->pop_ability.named.celestial_renewal;
int spell;
if(mod == 0){spell=2740;}
else if(mod==1){spell=3250;}
else if(mod==2){spell=3251;}
CastSpell(spell,targ,9,100,0,0,0);
timermod=900;
break;
}
else
CastToClient()->Message(0,"you have not learned this skill");
}
break;
case 39: //bestow DA
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.bestow_divine_aura;
if(cur_level == 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastSpell(2741,targ,9,0,0,0,0);
int mod=CastToClient()->GetAAStruct()->pop_ability.named.hastened_divinity;
int time;
if(mod == 0){time=8640;}
else if(mod == 1){time=7776;}
else if(mod == 2){time=6912;}
else if(mod == 3){time=6048;}
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 40: //turn undead
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.turn_undead;
int mod=CastToClient()->GetAAStruct()->pop_ability.named.hastened_turning;
if(cur_level > 0)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
int spell;
if(cur_level==1){spell=2776;}
else if(cur_level==2){spell=2777;}
else if(cur_level==3){spell=2778;}
int time;
if(mod==0){time=4320;}
else if(mod==1){time=3888;}
else if(mod==2){time=3456;}
else if(mod==3){time=3024;}
CastSpell(spell,targ,9,2500,0,0,0);
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 41: //purify soul
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.purify_soul;
int mod=CastToClient()->GetAAStruct()->pop_ability.named.hastened_purification_of_the_soul;
if(cur_level==1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastSpell(2742,targ,9,0,0,0,0);
int time;
if(mod==0){time=1800;}
else if(mod==1){time=1620;}
else if(mod==2){time=1440;}
else if(mod==3){time=1260;}
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 43: //exodus
{
targ=ct;
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.exodus;
int mod=CastToClient()->GetAAStruct()->pop_ability.named.hastened_exodus;
if(cur_level==1)
{
CastSpell(2771,targ,9,100,0,0,0);
int time;
if(mod==0){time=4320;}
else if(mod==1){time=3888;}
else if(mod==2){time=3456;}
else if(mod==3){time=3024;}
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 46: //dire charm
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.dire_charm;
if(cur_level==1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
int spell;
if((CastToClient()->GetClass())==DRUID){spell=2760;}
else if((CastToClient()->GetClass())==ENCHANTER){spell=2761;}
else if((CastToClient()->GetClass())==NECROMANCER){spell=2759;}
CastSpell(spell,targ,9,6000,0,0,0);
timermod=4320;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 47: //cannibalization
{
targ=ct;
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.cannibalization;
if(cur_level == 1)
{
CastSpell(2749,targ,9,2500,0,0,0);
timermod=180;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 50: //rabid bear
{
targ=ct;
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.rabid_bear;
int mod=CastToClient()->GetAAStruct()->pop_ability.named.hastened_rabidity;
if(cur_level==1)
{
int time;
if(mod==0){time=7200;}
else if(mod==1){time=6480;}
else if(mod==2){time=5760;}
else if(mod==3){time=5040;}
CastSpell(2750,targ,9,100,0,0,0);
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 52: //wizard familiars
{
targ=ct;
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.improved_familiar;
if(cur_level==1)
{
int mod=CastToClient()->GetAAStruct()->pop_ability.named.allegiant_familiar;
int spell;
if(mod==0){spell=2758;}
else if(mod==1){spell=3264;}
CastSpell(spell,targ,9,16000,0,0,0);
timermod=7;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 53: //nexus gate
{
targ=ct;
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.nexus_gate;
if(cur_level==1)
{
CastSpell(2734,targ,9,0,0,0,0);
timermod=4320;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 57: //gather mana
{
targ=ct;
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.gather_mana;
if(cur_level==1)
{
int mod=CastToClient()->GetAAStruct()->pop_ability.named.hastened_gathering;
int time;
if(mod==0){time=8640;}
else if(mod==1){time=7776;}
else if(mod==2){time=6912;}
else if(mod==3){time=6048;}
CastSpell(2753,targ,9,2000,0,0,0);
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 58: //Mend Companion
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.mend_companion;
if(cur_level==1)
{
targ=ct;
int mod=CastToClient()->GetAAStruct()->pop_ability.named.hastened_mending;
int time;
if(mod==0){time=2160;}
else if(mod==1){time=1944;}
else if(mod==2){time=1728;}
else if(mod==3){time=1512;}
CastSpell(2752,targ,9,0,0,0,0);
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 60: //Frenzied Burnout
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.frenzied_burnout;
if(cur_level == 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastSpell(2754,targ,9,2000,0,0,0);
timermod=4320;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 61: //mage ele form fire
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.elemental_form_fire;
if(cur_level >= 1)
{
targ=ct;
int spell;
if(cur_level==1){spell=2795;}
if(cur_level==2){spell=2796;}
if(cur_level==3){spell=2797;}
CastSpell(spell,targ,9,8000,0,0,0);
timermod=900;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 62: //mage ele form water
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.elemental_form_water;
if(cur_level >= 1)
{
targ=ct;
int spell;
if(cur_level==1){spell=2798;}
if(cur_level==2){spell=2799;}
if(cur_level==3){spell=2800;}
CastSpell(spell,targ,9,8000,0,0,0);
timermod=900;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 63: //mage ele form earth
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.elemental_form_earth;
if(cur_level >= 1)
{
targ=ct;
int spell;
if(cur_level==1){spell=2792;}
if(cur_level==2){spell=2793;}
if(cur_level==3){spell=2794;}
CastSpell(spell,targ,9,8000,0,0,0);
timermod=900;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 64: //mage ele form air
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.elemental_form_air;
if(cur_level >= 1)
{
targ=ct;
int spell;
if(cur_level==1){spell=2789;}
if(cur_level==2){spell=2790;}
if(cur_level==3){spell=2791;}
CastSpell(spell,targ,9,8000,0,0,0);
timermod=900;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 66: //turn summoned.....supposed to be 3 levs?? UI only has 1??
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.turn_summoned;
int mod=CastToClient()->GetAAStruct()->pop_ability.named.hastened_banishment;
if(cur_level > 0)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
int spell;
if(cur_level==1){spell=2779;}
else if(cur_level==2){spell=2780;}
else if(cur_level==3){spell=2781;}
int time;
if(mod==0){time=4320;}
else if(mod==1){time=3888;}
else if(mod==2){time=3456;}
else if(mod==3){time=3024;}
CastSpell(spell,targ,9,2500,0,0,0);
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 68: //Life Burn
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.life_burn;
if(cur_level==1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastSpell(2755,targ,9,6000,0,0,0);
timermod=8640;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 69: //Dead mesmerization
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.dead_mesmerization;
if(cur_level==1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastToClient()->Message(0,"Sorry, Dead Mesmerization not working YET");
CastSpell(2756,targ,9,3000,0,0,0);
timermod=4320;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 70: //fearstorm
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.fearstorm;
if(cur_level==1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastSpell(2757,targ,9,3000,0,0,0);
timermod=4320;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 71: //flesh to bone
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.flesh_to_bone;
if(cur_level==1)
{
targ=ct;
CastToClient()->Message(0,"Sorry, Flesh to Bone not working YET");
CastSpell(2772,targ,9,3000,0,0,0);
timermod=7;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 72: //call to corpse
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.call_to_corpse;
if(cur_level==1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastSpell(2764,targ,9,5000,0,0,0);
timermod=4320;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 73: //divine stun
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.divine_stun;
int mod=CastToClient()->GetAAStruct()->pop_ability.named.rush_to_judgment;
if(cur_level == 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
int time;
if(mod==0){time=30;}
else if(mod==1){time=23;}
else if(mod==2){time=16;}
else if(mod==3){time=9;}
CastSpell(2190,targ,9,1500,0,0,0);
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 76: //act of valor
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.act_of_valor;
if(cur_level == 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastSpell(2775,targ,9,0,0,0,0);
int heal=c->GetHP();
int curhp=target->GetHP();
target->SetHP(heal+curhp);
c->Death(c,0,0,0);
timermod=4320;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 77: //holy steed------Default fast horse
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.holy_steed;
if(cur_level == 1)
{
targ=ct;
CastSpell(2871,targ,9,2000,0,0,0);
timermod=1;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 80: //innate camo
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.innate_camouflage;
if(cur_level == 1)
{
targ=ct;
CastSpell(2765,targ,9,1,0,0,0);
timermod=7;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 85: //unholy steed-----default fast horse
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.unholy_steed;
if(cur_level == 1)
{
targ=ct;
CastSpell(2918,targ,9,2000,0,0,0);
timermod=1;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 86: //Improved HT
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.improved_harm_touch;
if(cur_level == 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastToClient()->Message(0,"Sorry Improved harmtouch not working YET");
timermod=4320;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 87: //Leech touch
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.leech_touch;
if(cur_level == 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastSpell(2766,targ,9,1,0,0,0);
timermod=4320;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 98: //purify body
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.purify_body;
int mod=CastToClient()->GetAAStruct()->pop_ability.named.hastened_purification_of_the_body;
if(cur_level == 1)
{
targ=ct;
CastToClient()->Message(0,"Sorry, Purify Body not working YET");
int time;
if(mod==0){time=4320;}
else if(mod==1){time=3888;}
else if(mod==2){time=3456;}
else if(mod==3){time=3024;}
CastSpell(2190,targ,9,0,0,0,0);
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 102: //escape
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.escape;
int mod=CastToClient()->GetAAStruct()->pop_ability.named.hasty_exit;
int modtwo=CastToClient()->GetAAStruct()->god_ability.named.improved_hasty_exit;
if(cur_level == 1)
{
targ=ct;
CastToClient()->Message(0,"Sorry, Escape not working YET");
int time;
if(mod==0){time=4320;}
else if((mod==1)&&(modtwo==0)){time=3888;}
else if((mod==2)&&(modtwo==0)){time=3456;}
else if((mod==3)&&(modtwo==0)){time=3024;}
else if((mod==3)&&(modtwo==1)){time=2592;}
else if((mod==3)&&(modtwo==2)){time=2175;}
CastSpell(5244,targ,9,0,0,0,0);
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 107: //purge poison
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.purge_poison;
int mod=CastToClient()->GetAAStruct()->pop_ability.named.hastened_purification;
if(cur_level == 1)
{
targ=ct;
CastToClient()->Message(0,"Sorry, Purify Body not working YET");
int time;
if(mod==0){time=4320;}
else if(mod==1){time=3888;}
else if(mod==2){time=3456;}
else if(mod==3){time=3024;}
CastSpell(5232,targ,9,0,0,0,0);
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 109: //rampage
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.rampage;
int mod=CastToClient()->GetAAStruct()->pop_ability.named.furious_rampage;
if(cur_level == 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
Attack(target,13);
int time;
if(mod==0){time=600;}
else if(mod==1){time=540;}
else if(mod==2){time=480;}
else if(mod==3){time=420;}
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 110: //AE taunt
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.area_taunt;
int mod=CastToClient()->GetAAStruct()->pop_ability.named.hastened_instigation;
if(cur_level == 1)
{
targ=ct;
CastToClient()->Message(0,"Sorry, AE Taunt not working YET");
int time;
if(mod==0){time=900;}
else if(mod==1){time=810;}
else if(mod==2){time=720;}
else if(mod==3){time=630;}
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 111: //warcry
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.warcry;
if(cur_level >= 1)
{
targ=ct;
CastToClient()->Message(0,"Sorry, Warcry not working YET");
int spell;
if(cur_level==1){spell=5229;}
else if(cur_level==2){spell=5230;}
else if(cur_level==3){spell=5231;}
CastSpell(spell,targ,9,0,0,0,0);
timermod=2160;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 117: //strong root
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.strong_root;
int mod=CastToClient()->GetAAStruct()->pop_ability.named.hastened_root;
if(cur_level == 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
int time;
if(mod==0){time=4320;}
else if(mod==1){time=3888;}
else if(mod==2){time=3456;}
else if(mod==3){time=3024;}
CastSpell(2748,targ,9,2000,0,0,0);
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 126: //hobble of spirits
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.hobble_of_spirits;
if(cur_level == 1)
{
targ=ct;
CastSpell(3290,targ,9,3000,0,0,0);
timermod=300;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 127: //frenzy of spirit
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.frenzy_of_spirit;
if(cur_level == 1)
{
targ=ct;
CastSpell(3289,targ,9,0,0,0,0);
timermod=720;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 128: //paragon
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.paragon_of_spirit;
if(cur_level == 1)
{
targ=ct;
CastSpell(3291,targ,9,5000,0,0,0);
timermod=900;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 153: //radiant cure
{
int cur_level=CastToClient()->GetAAStruct()->pop_ability.named.radiant_cure;
int mod=CastToClient()->GetAAStruct()->god_ability.named.quickened_curing;
if(cur_level >= 1)
{
targ=ct;
int spell;
if(cur_level==1){spell=3297;}
else if(cur_level==2){spell=3298;}
else if(cur_level==3){spell=3299;}
int time;
if(mod==0){time=180;}
else if(mod==1){time=162;}
else if(mod==2){time=144;}
else if(mod==3){time=126;}
CastSpell(spell,targ,9,3500,0,0,0);
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 169: //divine arbitration
{
int cur_level=CastToClient()->GetAAStruct()->pop_ability.named.divine_arbitration;
if(cur_level >= 1)
{
targ=ct;
int spell;
if(cur_level==1){spell=3252;}
else if(cur_level==2){spell=3253;}
else if(cur_level==3){spell=3254;}
CastSpell(spell,targ,9,750,0,0,0);
timermod=180;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 170: //wrath of the wild
{
int cur_level=CastToClient()->GetAAStruct()->pop_ability.named.wrath_of_the_wild;
if(cur_level >= 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
int spell;
if(cur_level==1){spell=3255;}
else if(cur_level==2){spell=3256;}
else if(cur_level==3){spell=3257;}
CastSpell(spell,targ,9,1000,0,0,0);
timermod=240;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 171: //virulent paralysis
{
int cur_level=CastToClient()->GetAAStruct()->pop_ability.named.virulent_paralysis;
if(cur_level >= 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
int spell;
if(cur_level==1){spell=3274;}
else if(cur_level==2){spell=3275;}
else if(cur_level==3){spell=3276;}
CastSpell(spell,targ,9,2000,0,0,0);
timermod=120;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 172: //harvest of druzzil
{
int cur_level=CastToClient()->GetAAStruct()->pop_ability.named.harvest_of_druzzil;
if(cur_level == 1)
{
targ=ct;
CastSpell(3338,targ,9,10000,0,0,0);
timermod=480;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 173: //eldritch rune
{
int cur_level=CastToClient()->GetAAStruct()->pop_ability.named.eldritch_rune;
if(cur_level >= 1)
{
targ=ct;
int spell;
if(cur_level==1){spell=3258;}
else if(cur_level==2){spell=3259;}
else if(cur_level==3){spell=3260;}
CastSpell(spell,targ,9,1,0,0,0);
timermod=600;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 174: //servant of ro
{
int cur_level=CastToClient()->GetAAStruct()->pop_ability.named.servant_of_ro;
if(cur_level >= 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastToClient()->Message(0,"Sorry, Servant of Ro not working YET");
int spell;
if(cur_level==1){spell=3265;}
else if(cur_level==2){spell=3266;}
else if(cur_level==3){spell=3267;}
CastSpell(spell,targ,9,500,0,0,0);
timermod=540;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 175: //wake the dead
{
int cur_level=CastToClient()->GetAAStruct()->pop_ability.named.wake_the_dead;
if(cur_level >= 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastToClient()->Message(0,"Sorry, Wake the Dead not working YET");
int spell;
if(cur_level==1){spell=3268;}
else if(cur_level==2){spell=3269;}
else if(cur_level==3){spell=3270;}
CastSpell(spell,targ,9,8000,0,0,0);
timermod=540;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 176: //suspend minion
{
int cur_level=CastToClient()->GetAAStruct()->pop_ability.named.suspended_minion;
if(cur_level >= 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastToClient()->Message(0,"Sorry Suspend Minion not working YET");
int spell;
if(cur_level==1){spell=3248;}
else if(cur_level==2){spell=3249;}
CastSpell(spell,targ,9,4000,0,0,0);
timermod=1;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 177: //spirit call
{
int cur_level=CastToClient()->GetAAStruct()->pop_ability.named.spirit_call;
if(cur_level >= 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastToClient()->Message(0,"Sorry, Spirit Call not working YET");
int spell;
if(cur_level==1){spell=3283;}
else if(cur_level==2){spell=3284;}
else if(cur_level==3){spell=3285;}
CastSpell(spell,targ,9,6500,0,0,0);
timermod=720;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 180: //hand of piety
{
int cur_level=CastToClient()->GetAAStruct()->pop_ability.named.hand_of_piety;
int mod=CastToClient()->GetAAStruct()->god_ability.named.hastened_piety;
if(cur_level >= 1)
{
targ=ct;
int spell;
if(cur_level==1){spell=3261;}
else if(cur_level==2){spell=3262;}
else if(cur_level==3){spell=3263;}
int time;
if(mod==0){time=2160;}
else if(mod==1){time=1920;}
else if(mod==2){time=1680;}
else if(mod==3){time=1440;}
CastSpell(spell,targ,9,0,0,0,0);
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 184: //guardian of the forest
{
int cur_level=CastToClient()->GetAAStruct()->pop_ability.named.guardian_of_the_forest;
if(cur_level >= 1)
{
targ=ct;
int spell;
if(cur_level==1){spell=3271;}
else if(cur_level==2){spell=3272;}
else if(cur_level==3){spell=3273;}
CastSpell(spell,targ,9,0,0,0,0);
timermod=900;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 185: //spirit of the wood
{
int cur_level=CastToClient()->GetAAStruct()->pop_ability.named.spirit_of_the_wood;
if(cur_level >= 1)
{
targ=ct;
int spell;
if(cur_level==1){spell=3277;}
else if(cur_level==2){spell=3278;}
else if(cur_level==3){spell=3279;}
CastSpell(spell,targ,9,0,0,0,0);
timermod=1320;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 199: //boastfull bellow
{
int cur_level=CastToClient()->GetAAStruct()->pop_ability.named.boastful_bellow;
if(cur_level == 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastSpell(3282,targ,9,0,0,0,0);
timermod=18;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 207: //host of elements
{
int cur_level=CastToClient()->GetAAStruct()->pop_ability.named.host_of_the_elements;
if(cur_level >= 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
int spell;
if(cur_level==1){spell=3286;}
else if(cur_level==2){spell=3287;}
else if(cur_level==3){spell=3288;}
CastSpell(spell,targ,9,6500,0,0,0);
timermod=1320;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 208: //call of xuzl
{
int cur_level=CastToClient()->GetAAStruct()->pop_ability.named.call_of_xuzl;
if(cur_level >= 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
int spell;
if(cur_level==1){spell=3292;}
else if(cur_level==2){spell=3293;}
else if(cur_level==3){spell=3294;}
CastSpell(spell,targ,9,6500,0,0,0);
timermod=900;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
|
|
|
|
|
|
|
08-01-2004, 02:46 PM
|
Sarnak
|
|
Join Date: May 2004
Posts: 58
|
|
uhh whoops seems there some limit as to how much one post can display so heres the rest of the stuff from case 212 down
Code:
case 212: //fading memories
{
int cur_level=CastToClient()->GetAAStruct()->pop_ability.named.fading_memories;
if(cur_level >= 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastToClient()->Message(0,"Sorry Fading Memories not working YET");
CastSpell(5243,targ,9,0,0,0,0);
timermod=1;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 217: //project illusion
{
int cur_level=CastToClient()->GetAAStruct()->pop_ability.named.project_illusion;
if(cur_level == 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastToClient()->Message(0,"Sorry, Project Illusion not working YET");
timermod=1;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 219: //entrap
{
int cur_level=CastToClient()->GetAAStruct()->pop_ability.named.entrap;
if(cur_level == 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastSpell(3614,targ,9,1750,0,0,0);
timermod=5;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 226: //manaburn
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.mana_burn;
if(cur_level == 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastSpell(2751,targ,9,6000,0,0,0);
timermod=8640;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 245: //bestial allignment
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.bestial_alignment;
if(cur_level >= 1)
{
CastToClient()->Message(0,"Sorry Bestial Alignment not working YET");
targ=ct;
int crace=CastToClient()->GetBaseRace();
int spell;
if((cur_level==1)&&(crace==2)){spell=4521;}
else if((cur_level==2)&&(crace==2)){spell=4522;}
else if((cur_level==3)&&(crace==2)){spell=4523;}
else if((cur_level==1)&&(crace==9)){spell=4524;}
else if((cur_level==2)&&(crace==9)){spell=4525;}
else if((cur_level==3)&&(crace==9)){spell=4526;}
else if((cur_level==1)&&(crace==10)){spell=4527;}
else if((cur_level==2)&&(crace==10)){spell=4528;}
else if((cur_level==3)&&(crace==10)){spell=4529;}
else if((cur_level==1)&&(crace==128)){spell=4530;}
else if((cur_level==2)&&(crace==128)){spell=4531;}
else if((cur_level==3)&&(crace==128)){spell=4532;}
else if((cur_level==1)&&(crace==130)){spell=4533;}
else if((cur_level==2)&&(crace==130)){spell=4534;}
else if((cur_level==3)&&(crace==130)){spell=4535;}
CastSpell(spell,targ,9,0,0,0,0);
timermod=4320;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 247: //feral swipe
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.feral_swipe;
if(cur_level == 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastToClient()->Message(0,"Sorry, Feral Swipe not working YET");
CastSpell(4788,targ,9,0,0,0,0);
timermod=60;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 254: //divine avatar
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.divine_avatar;
if(cur_level >= 1)
{
targ=ct;
int spell;
CastToClient()->Message(0,"Sorry, Divine Avatar not working YET");
if(cur_level==1){spell=4549;}
else if(cur_level==2){spell=4550;}
else if(cur_level==3){spell=4551;}
CastSpell(spell,targ,9,3000,0,0,0);
timermod=7200;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 255: //equisite benadiction
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.exquisite_benediction;
if(cur_level >= 1)
{
targ=ct;
int spell;
CastToClient()->Message(0,"Sorry Equisite Benediction not working YET");
if(cur_level==1){spell=4790;}
else if(cur_level==2){spell=4791;}
else if(cur_level==3){spell=4792;}
else if(cur_level==4){spell=4793;}
else if(cur_level==5){spell=4794;}
CastSpell(spell,targ,9,0,0,0,0);
timermod=1800;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 257: //natures boon
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.natures_boon;
if(cur_level >= 1)
{
targ=ct;
int spell;
CastToClient()->Message(0,"Sorry Natures Boon not working YET");
if(cur_level==1){spell=4796;}
else if(cur_level==2){spell=4797;}
else if(cur_level==3){spell=4798;}
else if(cur_level==4){spell=4799;}
else if(cur_level==5){spell=4800;}
CastSpell(spell,targ,9,0,0,0,0);
timermod=1800;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 261: //doppelganger
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.doppelganger;
if(cur_level >= 1)
{
targ=ct;
int spell;
CastToClient()->Message(0,"Sorry Doppelganer not working YET");
if(cur_level==1){spell=4552;}
else if(cur_level==2){spell=4553;}
else if(cur_level==3){spell=4554;}
CastSpell(spell,targ,9,0,0,0,0);
timermod=4320;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 265: //shared health
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.shared_health;
if(cur_level >= 1)
{
targ=ct;
CastToClient()->Message(0,"Sorry Shared Health not working YET");
timermod=900;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 276: //destructive force 3 levs
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.destructive_force;
if(cur_level >= 1)
{
targ=ct;
CastToClient()->Message(0,"Sorry Destructive Force not working YET");
timermod=3600;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 277: //swarm of decay
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.swarm_of_decay;
if(cur_level >= 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
int spell;
CastToClient()->Message(0,"Sorry Swarm of Decay not working YET");
if(cur_level==1){spell=4564;}
else if(cur_level==2){spell=4565;}
else if(cur_level==3){spell=4566;}
CastSpell(spell,targ,9,0,0,0,0);
timermod=1800;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 285: //radiant cure 2?????
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.radiant_cure;
int mod=CastToClient()->GetAAStruct()->god_ability.named.quickened_curing;
if(cur_level >= 1)
{
targ=ct;
int spell;
if(cur_level==1){spell=3297;}
else if(cur_level==2){spell=3298;}
else if(cur_level==3){spell=3299;}
int time;
if(mod==0){time=180;}
else if(mod==1){time=162;}
else if(mod==2){time=144;}
else if(mod==3){time=126;}
CastSpell(spell,targ,9,3500,0,0,0);
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 286: //purification---made it a self only purify soul
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.purification;
if(cur_level >= 1)
{
targ=ct;
CastToClient()->Message(0,"Sorry, Purification not working, enjoy your self only purify soul");
CastSpell(2742,targ,9,0,0,0,0);
timermod=4320;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 289: //flaming arrows
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.flaming_arrows;;
if(cur_level >= 1)
{
targ=ct;
CastToClient()->Message(0,"Sorry Flaming Arrows not working YET");
timermod=4320;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 290: //frost arrows
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.frost_arrows;;
if(cur_level >= 1)
{
targ=ct;
CastToClient()->Message(0,"Sorry Frost Arrows not working YET");
timermod=4320;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 298: //call of the ancients
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.call_of_the_ancients;
if(cur_level >= 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
int spell;
CastToClient()->Message(0,"Sorry Call of the Ancients not working YET");
if(cur_level==1){spell=4828;}
else if(cur_level==2){spell=4829;}
else if(cur_level==3){spell=4830;}
else if(cur_level==4){spell=4831;}
else if(cur_level==5){spell=4832;}
CastSpell(spell,targ,9,0,0,0,0);
timermod=1800;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 300: //warlords tenacity
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.warlords_tenacity;
if(cur_level >= 1)
{
targ=ct;
int spell;
if(cur_level==1){spell=4925;}
else if(cur_level==2){spell=4926;}
else if(cur_level==3){spell=4927;}
CastSpell(spell,targ,9,0,0,0,0);
timermod=3600;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 303: //ro's flaming familiar
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.ros_flaming_familiar;
if(cur_level == 1)
{
targ=ct;
CastToClient()->Message(0,"Sorry Ro's Flaming Familiar not working YET");
CastSpell(4833,targ,9,0,0,0,0);
timermod=60;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 304: //eci's icy familiar
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.ecis_icy_familiar;
if(cur_level == 1)
{
targ=ct;
CastToClient()->Message(0,"Sorry Eci's Icy Familiar not working YET");
CastSpell(4834,targ,9,0,0,0,0);
timermod=60;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 305: //druzzils familiar
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.druzzils_mystical_familiar;
if(cur_level == 1)
{
targ=ct;
CastToClient()->Message(0,"Sorry Druzzil's Mystical Familiar not working YET");
CastSpell(4835,targ,9,0,0,0,0);
timermod=60;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 307: //ward of destruction
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.call_of_the_ancients;
if(cur_level >= 1)
{
targ=ct;
int spell;
CastToClient()->Message(0,"Sorry Ward of Destruction not working YET");
if(cur_level==1){spell=4836;}
else if(cur_level==2){spell=4837;}
else if(cur_level==3){spell=4838;}
else if(cur_level==4){spell=4839;}
else if(cur_level==5){spell=4840;}
CastSpell(spell,targ,9,0,0,0,0);
timermod=1800;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
case 308: //frenzied devastation
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.frenzied_devastation;
if(cur_level >= 1)
{
targ=ct;
int spell;
CastToClient()->Message(0,"Sorry Frenzied Devastation not working YET");
if(cur_level==1){spell=5245;}
else if(cur_level==2){spell=5246;}
else if(cur_level==3){spell=5247;}
CastSpell(spell,targ,9,0,0,0,0);
timermod=4320;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
}
time_t timestamp=time(NULL);
APPLAYER* outapp = new APPLAYER(OP_AAAction,sizeof(UseAA_Struct));
UseAA_Struct* uaa = (UseAA_Struct*)outapp->pBuffer;
uaa->ability=activate;
uaa->begin=timestamp;
uaa->end=timestamp;
database.UpdateAATimers(this->CharacterID(),timestamp+timermod,timestamp,activate);
AbilityTimer=true;
QueuePacket(outapp);
safe_delete(outapp);
}
anyway um i think i did that correctly if not ill try to fix it, sorry ive never done this before, also let me state again im just learning so please feel free to explain how i maybe did something wrong or suggestions on how to make this better, also does anyone know how to make an if statement for things such as manaburn were it would need values not included in the spell? ive tried thigns like
if(SpellFinished == TRUE) and the result is always that the damage happens the instant the button is pushed, anyone know of a way to make it interuptable and wait untill casting is complete? anyway questions, comments, suggestons appreciated.
|
|
|
|
|
|
|
08-01-2004, 04:50 PM
|
Sarnak
|
|
Join Date: May 2004
Posts: 58
|
|
also a shadowknight friend of mine told me that after level 40 HT is a different spell so i tried correcting it in zone/client_process.cpp around line 2127 by adding
Code:
else if((GetClass() == SHADOWKNIGHT)&&(GetLevel() <= 39))
{
ability=89; // solar: TODO check this value, why is it not 88?
spell_to_cast = 88;
}
else if((GetClass() == SHADOWKNIGHT)&&(GetLevel() >= 40))
{
ability=89;
spell_to_cast = 2821;
}
else
however the line below it
Code:
if(spell_to_cast != castspell->spell_id)
{
InterruptSpell(castspell->spell_id); //CHEATER!!!
break;
}
prevents spell 2821 from being cast, so does anyone know how i could make 2821 an allowable spell for HT since im pretty sure it is correct, but i may be wrong since ive never played an SK myself.
also as a correction to the above post in case 117 in client.cpp strong root, the cast time should be 2 seconds correct this by making line 4052- CastSpell(2748,targ,9,2000,0,0,0); anyway uh thanks again.
|
|
|
|
|
|
|
08-03-2004, 11:46 AM
|
Sarnak
|
|
Join Date: May 2004
Posts: 58
|
|
So im the only one working on fixing AA or interested in them i guess? well anyway they'll be here if anyone else ever is /shrug.
Heres the fix for a 100% working manaburn, well except for the reuse timer which ill fix shortly i guess, NOTE you must edit the spell in spells_us.txt or spells_en.txt to make the damage 0.
ok in zone\spells.cpp around line 879 add the following-
Code:
updated in later post.
then in zone\client.cpp correct case 226 to be-
Code:
case 226: //manaburn
{
int cur_level=CastToClient()->GetAAStruct()->god_ability.named.mana_burn;
if(cur_level == 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastSpell(2751,targ,9,6000,0,0,0);
timermod=8640;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
i know lifeburn is very similar so i should have it fixed within a few minutes, please tell me someone has atleast tested these out?
also should i repost the above code from my first post since i messed it up a little, so its more copy and paste friendly? also does anyone know the itemslot number for the item on the cursor? or have any other ideas as to how to make flesh to bone work?
anyway thanks again.
|
|
|
|
08-03-2004, 02:05 PM
|
|
Demi-God
|
|
Join Date: Mar 2003
Location: USA
Posts: 1,067
|
|
Sometimes it takes a while for something to soak in.
Give them time to figure out what you did.
And good job!
__________________
Maybe I should try making one of these servers...
|
|
|
|
08-03-2004, 03:14 PM
|
Sarnak
|
|
Join Date: May 2004
Posts: 58
|
|
thanks scorpious2k, im really hoping those who have servers of their own and maybe a little freetime will throw this in and test a few out, as i wont even claim to know how most of them actually work so i just put in the default cast time etc etc while the actual skill may be instant, also to test if there are other side effects other than zone.exe finding any invalid AA profile the first 2 or 3 times an exsisting character with AA zones. useing a BACKUP database of course!
anyway here lifeburn as i think it should be going by the description in EQ~
zone\spells.cpp around line 896 assuming you already put manaburn in here-
Code:
updated in later post.
dont forget to edit the servers spell listing for lifeburn in spell_us.txt or spells_en.txt also so that lifeburn does 0 damage.
zone\client.cpp case 68
Code:
case 68: //Life Burn
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.life_burn;
if(cur_level==1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastSpell(2755,targ,9,6000,0,0,0);
timermod=8640;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
anyway since ive only played a warrior and wizard im unsure of how this is supposed to work but this makes the spell cast 6 seconds does damage = to your current hp, then sets your current hp to 1 and does the lifebond effect for 250 a tick, this correct?
|
|
|
|
08-03-2004, 03:28 PM
|
Hill Giant
|
|
Join Date: Jul 2004
Location: In my basement
Posts: 131
|
|
lifeburn does your damage in hp lowers you to 25% hp and then gives you a 250 hp a tick regen for 4 ticks
|
|
|
|
08-11-2004, 03:34 PM
|
Sarnak
|
|
Join Date: May 2004
Posts: 58
|
|
still working on this but been busy, anyway heres a few others that might be good enough to use.
lifeburn correction, although the FD effect in the recource is real buggy and causes the spell to be no agro, suppose to?
zone\spells.cpp repleace exsisting with-
Code:
updated in later post.
Fearless and Fear resistance, also in zone\spells.cpp around line 1708 add-
Code:
// solar: now check if the spell is allowed to land
if((spelltar->IsClient())&&(IsEffectInSpell(spell_id,SE_Fear))&&((spelltar->CastToClient()->GetAAStruct()->class_skills.named.fearless)==1))
{
entity_list.MessageClose(spelltar, false, 50, 0, "%s has no Fear!", spelltar->GetName());
return false;
}
if((spelltar->IsClient())&&(IsEffectInSpell(spell_id,SE_Fear))&&((spelltar->CastToClient()->GetAAStruct()->archetype_skills.named.fear_resistance)>=1))
{
int lev=spelltar->CastToClient()->GetAAStruct()->archetype_skills.named.fear_resistance;
int r=MakeRandomInt(1,100);
if((lev == 1)&&(r >= 95))
{
spelltar->CastToClient()->Message(0,"You overcome your Fears.");
return false;
}
else if((lev == 2)&&(r >= 90))
{
spelltar->CastToClient()->Message(0,"You overcome your Fears.");
return false;
}
else if((lev == 3)&&(r >= 75))
{
spelltar->CastToClient()->Message(0,"You overcome your Fears.");
return false;
}
}
act of valor- zone/client.cpp around line 3808 replace exsisting with-
Code:
case 76: //act of valor
{
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.act_of_valor;
if(cur_level == 1)
{
if(target>0){targ=target->GetID();}
else if(target==0)
{
CastToClient()->Message(0,"Skill requires a target");
break;
}
CastSpell(2775,targ,9,0,0,0,0);
int heal=c->GetHP();
int curhp=target->GetHP();
target->SetHP(heal+curhp);
c->Death(c,0,0,0);
timermod=4320;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
also in client.cpp around line 4308 change case 186 to 184 to correct guardian of the forrest.
Archery Mastery and headshot i went through some logs of ranger friends from live and found a lot of the current archery code to be incorrect IMO so i kinda redid a whole lot of it and added a level check that brings things much closer to live i believe, i think its better but far from perfect yet, anyway
zone/client_process.cpp around line 2268- remove everything from
float chancetohit = 0;
down to the } that is right above
float multiple=(GetLevel()/5);
and replace with-
Code:
float chancetohit = 0;
if(target){
if(target->IsNPC())
chancetohit = GetSkill(ARCHERY) / 3.75;
else
chancetohit = GetSkill(ARCHERY) / 4.75; //harder to hit players
if (m_pp.level-target->GetLevel() < 0) {
chancetohit -= (float)((target->GetLevel()-m_pp.level)*(target->GetLevel()-m_pp.level))/4;
}
int16 targetagi = target->GetAGI();
int16 playerDex = (int16)(this->itembonuses->DEX + this->spellbonuses->DEX)/2;
int16 levmod =0;
if((this->GetLevel()-20) <= (target->GetLevel()))
{
levmod = ((target->GetLevel())-(this->GetLevel()-20))*0.5;
}
targetagi = (targetagi <= 200) ? targetagi:targetagi + ((targetagi-200)/5);
chancetohit -= (float)targetagi*0.05;
chancetohit += playerDex;
chancetohit = (chancetohit > 0) ? chancetohit+30:30;
chancetohit -= levmod;
chancetohit = chancetohit*0.5;
chancetohit = chancetohit > 95 ? 95 : chancetohit; // cap to 95%
// Hit?
if (MakeRandomFloat(0, 100) > chancetohit) {
//this->Message(MT_Emote, "You missed your target");
//this->Message_StringID(M,GENERIC_MISS,"You","your target.");
target->Damage(this, 0, 0xffff, 0x07);
}
else {
const Item_Struct* RangeItem = RangeWeapon->GetItem();
const Item_Struct* AmmoItem = Ammo->GetItem();
uint16 WDmg = RangeItem->Common.Damage;
uint16 ADmg = AmmoItem->Common.Damage;
int lev=CastToClient()->GetAAStruct()->class_skills.named.archery_mastery;
int mod = 0;
if(lev==0){mod=1;}
else if(lev==1){mod=1.3;}
else if(lev==2){mod=1.6;}
else if(lev==3){mod=2.0;}
uint16 levelBonus = (GetSTR()+GetLevel()+GetSkill(ARCHERY)) / 100;
uint16 MaxDmg = (WDmg+ADmg)*levelBonus*mod;
sint32 TotalDmg = 0;
sint32 critDmg = 0;
if (MaxDmg == 0)
MaxDmg = 1;
TotalDmg = (1 + MakeRandomInt(0, MaxDmg));
if(GetClass()==RANGER) {
critDmg = (sint32)(TotalDmg * 2);
}
if(target->IsClient()){ //Tone down pvp damage
if(critDmg>0)
critDmg-=critDmg/4;
TotalDmg-=TotalDmg/4;
}
if ((GetClass()==RANGER)&&((GetAAStruct()->pop_ability.named.headshot)==1)&&((target->GetLevel()) <= (this->GetLevel()-20))&&(MakeRandomInt(0,100) >= 75)&&(target->IsNPC()))
{ //headshot
entity_list.MessageClose(this, false, 50, 0, "%s scores a HEADSHOT!", this->GetName());
target->Damage(this, 32000, 0xffff, 0x07);
}
// no crits before level 12 cap is maxed //todo make crits based on AA for other classes
else if((GetClass()==RANGER)&&(GetSkill(ARCHERY)>65)&&(MakeRandomInt(0, 500) < (GetSkill(ARCHERY)+playerDex)/2)) {
if(target->IsNPC() && !target->IsMoving() && !target->IsRooted() && this->GetLevel()>50){
if(this->GetGM())
{
Message(0,"(GM ONLY) Doubling attack damage, npc isnt moving!");
critDmg*=2;
}
}
char val1[20]={0};
entity_list.MessageClose_StringID(this, false, 200, MT_CritMelee, CRITICAL_HIT, GetName(), ConvertArray(critDmg,val1));
//this->Message_StringID(MT_CritMelee,CRITICAL_HIT,GetName(),ConvertArray(critDmg,val1));
//this->Message(MT_CritMelee, "You score a critical hit!(%d)", critDmg);
target->Damage(this, critDmg, 0xffff, 0x07);
}
else {
if(GetClass()==RANGER && !target->IsMoving() && !target->IsRooted() && this->GetLevel()>50){
if(this->GetGM())
{
Message(0,"(GM ONLY) Doubling attack damage, npc isnt moving!");
TotalDmg*=2;
}
}
char hitname[64]={0};
strncpy(hitname,target->GetName(),strlen(target->GetName())-2);
//char val1[20]={0};
//Message_StringID(MT_Emote,HIT_NON_MELEE,"You",hitname,ConvertArray(TotalDmg,val1));
//this->Message(MT_Emote, "You Hit for a total of %d non-melee damage.", TotalDmg);
target->Damage(this, TotalDmg, 0xffff, 0x07);
}
}
// See if the player increases their skill - with cap
float wisebonus = (GetWIS() > 200) ? 20 + ((GetWIS() - 200) * 0.05) : GetWIS() * 0.1;
if (((55-(GetSkill(ARCHERY)*0.240))+wisebonus > MakeRandomFloat(0, 100)) && (GetSkill(ARCHERY)<(m_pp.level+1)*5) && GetSkill(ARCHERY) < 252)
this->SetSkill(ARCHERY,GetSkill(ARCHERY)+1);
}
break;
}
Flurry, i made it 5, 10, 20% chance per lev based on something i read somewhere and just guessed and made it a 50% chance at 2 extra attacks when it triggers, also im not exactly sure how raging flurry works, from the wording it sounds like it might increase the chance of the second attack happening however a friend said it improves the chance of flurry happening by 10% per rank, anyone know how this works? i also made the flurry report an area thing with a range of 30 just cause well i think its cooler looking
zone\client_process.cpp around line 5336 add-
Code:
if(((CastToClient()->GetAAStruct()->class_skills.named.flurry) >= 1)&&(IsAttackAllowed(target))
&&(CastingSpellID()==0)&&(CombatRange(target)))
{ //Dook- Flurry AA
int lev=0;
lev=CastToClient()->GetAAStruct()->class_skills.named.flurry;
float rana = MakeRandomFloat(0, 1);
float ranb = MakeRandomFloat(0, 1);
if((lev == 1)&&(rana >= 0.95))
{
entity_list.MessageClose(this,false,20,13,"%s unleashes a FLURRY of attacks on %s!", GetName(), target->GetCleanName());
Attack(target,13);
if(ranb >= 0.5){Attack(target,13);}
}
else if((lev == 2)&&(rana >= 0.90))
{
entity_list.MessageClose(this,false,20,13,"%s unleashes a FLURRY of attacks on %s!", GetName(), target->GetCleanName());
Attack(target,13);
if(ranb >= 0.5){Attack(target,13);}
}
else if((lev == 3)&&(rana >= 0.80))
{
entity_list.MessageClose(this,false,20,13,"%s unleashes a FLURRY of attacks on %s!", GetName(), target->GetCleanName());
Attack(target,13);
if(ranb >= 0.5){Attack(target,13);}
}
}
Ambidexterity heard things from 7% to %10 so i went with %10
also in client_process.cpp around line 5392 add-
Code:
if(CastToClient()->GetAAStruct()->class_skills.named.ambidexterity == 1)
{
DualWieldProbability = (GetSkill(DUAL_WIELD) + GetLevel()) / 354.5f; // 10% for ambidexterity
}
anyway thats all i got thats workable so far, more to come, anyone fixed wake the dead yet? i have no idea where to even start.
|
|
|
|
|
|
|
08-12-2004, 11:20 AM
|
Sarnak
|
|
Join Date: May 2004
Posts: 58
|
|
Temp Fix for MGB, far from perfect but it casts AE buffs and doubles manacost, also tries to affect NPCS, i know theres really no need for this on EMU servers due to the low population but /shrug.
zone\client.cpp replace exsisting with--
Code:
case 35: //MGB---AE cast group spell in slot 1
{
targ=ct;
int cur_level=CastToClient()->GetAAStruct()->class_skills.named.mass_group_buff;
if(cur_level == 1)
{
CastToClient()->Message(0,"Casting Spell in Slot 1 as an Area Effect");
int spell=m_pp.mem_spells[0];
if((IsGroupSpell(spell))&&(!IsEffectInSpell(spell,SE_Gate))&&
(!IsEffectInSpell(spell, SE_Translocate))&&(!IsEffectInSpell(spell, SE_Teleport))
&&(!IsEffectInSpell(spell, SE_Succor)))
{
int mana;
mana = spells[spell].mana;
mana = (GetActSpellCost(spell, mana))*2;
if(c->GetMana() >= mana)
{
int newmana=(c->GetMana() - mana);
entity_list.AESpell(c,c,100,spell);
c->CastSpell(spell,ct,9,0,0,0,0);
c->SetMana(newmana);
}
else
{
c->Message(13,"Insufficient Mana to cast this Spell.");
break;
}
}
else
{
c->Message(0,"MGB only works with Group Buffs!");
break;
}
int usemod=CastToClient()->GetAAStruct()->god_ability.named.quick_mass_group_buff;
int time;
if(usemod == 1){time=3888;}
else if(usemod == 2){time=3456;}
else if(usemod == 3){time=3024;}
else{time=4320;}
timermod=time;
break;
}
else
CastToClient()->Message(0,"You have not learned this skill");
}
break;
and heres something else i did while messing around, could be a fun way to remove extra plat from a server while beg doesnt work, its just a throw command inspired by the final fantasy games of course.
zone\client_process.cpp replace exsisting with----
Code:
case OP_Begging: //Throw command final fantasy style--
{
int p=m_pp.platinum;
int g=m_pp.gold;
int s=m_pp.silver;
int c=m_pp.copper;
Mob* target=CastToClient()->GetTarget();
int toss=(p*10)+(g*1)+(s*0.1)+(c*0.01);
if(toss>0)
{
if(target->IsAttackAllowed(target)&&(target->GetLevel()<=50))
{
int mana=CastToClient()->GetMana();
CastToClient()->DoAnim(5);
entity_list.MessageClose(this,true,50,0,"%s throws loose change at %s!", this->GetName(), target->GetCleanName());
CastToClient()->Message(0,"You Throw loose change at %s!", target->GetCleanName());
target->Damage(CastToClient(), toss, 0xFFFF, 0);
CastToClient()->SetMana(mana);
AddMoneyToPP(-c,-s,-g,-p,true);
}
else
{
CastToClient()->Message(0,"You don't think %s would be affected by coins, do you?", target->GetCleanName());
}
}
else
{
CastToClient()->Message(0,"To Throw change you must have change!");
}
break;
}
|
|
|
|
|
|
|
08-19-2004, 12:17 PM
|
Sarnak
|
|
Join Date: May 2004
Posts: 58
|
|
ok almost have swarm pets and wards done, however i need a lil more info about them, ive looked almost everywhere i can think of and havent had any luck getting details of what exactly some of them do, i understand the basics of most of them however i need more details on things like max hit on the AA swarm pets, max hit on the proc pets and info on the spells that the wards cast and how often they cast it and at what range etc etc, also details on the models would be really handy, i know the wizard swords and some of the proc pets are invis men with epics of the class however the SK one seems to be a skeleton instead, are any other class pet procs also other models than invis men? i also read that the call of time pet has a max hit of 415 which seems a lil off to me so was hoping for a second opinion.
swarm of decay is supposed to be skeleton archers, hows this work? are they rooted in place and just use archery i guess? yes, no? max hit? servant of ro, whats this do other than the base description, is the pet rooted? what spell does it cast?
anyway as you can see im missing a lot of minor details about a lot of these skills so if you know anything to be 100% correct please let me know so i can do these right the first time
is there any problem with me claiming bodytype 63 for temporary pets? its labeled as an unknown bodytype but was wondering if this had been updated somewhere that i dont know of, also im currently having some problems finding the location of the code that limits characters to 1 familiar at a time, ive tried tons of things to remove this temporarily however it never seems to work, is there something i dont know about the way familiars are handled?
currently im just making the pets despawn whenever their target gets below 2% or so health, however this is a problem and as they "can" ks players.
also thanks to everyone who helped when i booted my server publicly a few days ago i got a lot of usefull information, thanks again. if anyone knows any details of these skills or any others whos description is a lil off (doppelganger) please fill me in, yes ive tried all the basic sites like steel warriors allakhazam's and lucy but their all proving to be 99% useless to me.
|
|
|
|
08-19-2004, 01:18 PM
|
|
Discordant
|
|
Join Date: Feb 2004
Location: On your desktop
Posts: 387
|
|
Jesus nice work man
__________________
[12:38] <RangerDown> I watched Napoleon Dynamite the other day
[12:39] <Xabob> omg
[12:39] <Xabob> want me to shoot you now?
[12:39] <RangerDown> and the first words out of my mouth at the start were:
[12:39] <RangerDown> Hey I bet Rog looks like that
|
08-19-2004, 01:53 PM
|
Dragon
|
|
Join Date: Jun 2002
Posts: 776
|
|
What exactly does that begging code do? It takes the money you have on you and converts it into damage and throws it?
|
|
|
|
08-19-2004, 02:15 PM
|
Sarnak
|
|
Join Date: May 2004
Posts: 58
|
|
heh yeah it just takes the money on you and does 10 damage per plat, i did the lil attack animation and things also with it and if your curious as to why the Mana parts are in there well, at first it was causing hotkeys to lock up and for whatever reason adding the current mana bit fixed this, i honestly dont know how or why it fixed it but i had done some other skill on the beg button before and it never had a problem locking up, so i just went through the process of eliminations with the 2 and found that when i added some change to mana on it they no longer locked up....sorry thats the only explanation i have and also even with the manachange once every now and then it still seems to lock up for some people on my server, guess its something to do with patch state but really no clue. anyway im slowly creating a server with a few friends and i was just playing with that and they thought it was a really fun/neat command so i just thought id share it.
|
|
|
|
08-19-2004, 03:07 PM
|
Hill Giant
|
|
Join Date: Apr 2004
Posts: 110
|
|
Damn, nice job there Branks.
I hope the server admins can work with that.
|
08-19-2004, 11:54 PM
|
Hill Giant
|
|
Join Date: May 2004
Posts: 238
|
|
Definatly something that saves me alot your knocking out alot of aa's. I'm working on some stuff of my own soon too that u guys can use but. Dam nice job bro.
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
All times are GMT -4. The time now is 03:24 PM.
|
|
|
|
|
|
|
|
|
|
|
|
|