public override bool OnFirstHeartbeat(GameObject attachee, GameObject triggerer) { // Respawn if ((!GetGlobalFlag(912))) { StartTimer(604800000, () => respawn(attachee)); // 604800000ms is 1 week SetGlobalFlag(912, true); } // The 'evac' routine if (ScriptDaemon.get_f("boatmens_tavern_evac_on") && SelectedPartyLeader.GetMap() == 5052) { StartTimer(300, () => ScriptDaemon.set_f("boatmens_tavern_evac_on", false)); if (attachee.GetNameId() == 14133 && !ScriptDaemon.get_f("lodriss_killed_outside")) // For Lodriss { attachee.ClearObjectFlag(ObjectFlag.OFF); } else { // else : # For the others attachee.ClearObjectFlag(ObjectFlag.OFF); } } // game.new_sid = 0 if (attachee.GetNameId() == 14152 && SelectedPartyLeader.GetMap() == 5051) // Tolub, outside { attachee.ClearObjectFlag(ObjectFlag.OFF); } return(RunDefault); }
public override void OnSpellEffect(SpellPacketBody spell) { Logger.Info("Obscuring Mist OnSpellEffect"); spell.duration = 100 * spell.casterLevel; locXY locc_; if (spell.caster.GetNameId() == 8002 && SelectedPartyLeader.GetMap() == 5005) // Lareth in Moathouse { locc_ = new locXY(483, 534); } else { locc_ = spell.aoeCenter.location; } // spawn one spell_object object var spell_obj = GameSystems.MapObject.CreateObject(OBJECT_SPELL_GENERIC, locc_); // add to d20initiative var caster_init_value = spell.caster.GetInitiative(); spell_obj.InitD20Status(); spell_obj.SetInitiative(caster_init_value); // put sp-Obscuring Mist condition on obj var spell_obj_partsys_id = AttachParticles("sp-Obscuring Mist", spell_obj); spell_obj.AddCondition("sp-Obscuring Mist", spell.spellId, spell.duration, 0, spell_obj_partsys_id); // Added by Sitra Achara # spell_obj.SetInt(obj_f.secretdoor_dc, 333 + (1 << 15)); // Mark it as an "obscuring mist" object. // 1<<15 - marks it as "active" // bits 16 and onward - random ID number Co8PersistentData.AddToSpellActiveList(OBSCURING_MIST_KEY, spell.spellId, spell_obj); }
public override void OnSpellEffect(SpellPacketBody spell) { Logger.Info("Entangle OnSpellEffect"); spell.duration = 10 * spell.casterLevel; var outdoor_map_list = new[] { 5001, 5002, 5009, 5042, 5043, 5051, 5062, 5068, 5069, 5070, 5071, 5072, 5073, 5074, 5075, 5076, 5077, 5078, 5091, 5093, 5094, 5095, 5096, 5097, 5099, 5100, 5108, 5110, 5111, 5112, 5113, 5119, 5120, 5121, 5132, 5142, 5189 }; if (outdoor_map_list.Contains(SelectedPartyLeader.GetMap()) || !Co8Settings.EntangleOutdoorsOnly) { // spawn one Entangle scenery object var entangle_obj = GameSystems.MapObject.CreateObject(OBJECT_SPELL_GENERIC, spell.aoeCenter); // add to d20initiative var caster_init_value = spell.caster.GetInitiative(); entangle_obj.InitD20Status(); entangle_obj.SetInitiative(caster_init_value); // put sp-Entangle condition on obj var entangle_partsys_id = AttachParticles("sp-Entangle-Area", entangle_obj); entangle_obj.AddCondition("sp-Entangle", spell.spellId, spell.duration, 0, entangle_partsys_id); // entangle_obj.condition_add_arg_x( 3, entangle_partsys_id ) // objectevent_id = entangle_obj.condition_get_arg_x( 2 ) // Added by Sitra Achara # entangle_obj.SetInt(obj_f.secretdoor_dc, 153 + (1 << 15)); // Mark it as an "obscuring mist" object. // 1<<15 - marks it as "active" // bits 16 and onward - random ID number Co8PersistentData.AddToSpellActiveList(ENTANGLE_KEY, spell.spellId, entangle_obj); } else { // End of Section # // No plants to entangle with AttachParticles("Fizzle", spell.caster); spell.caster.FloatMesFileLine("mes/spell.mes", 30000); spell.caster.FloatMesFileLine("mes/spell.mes", 16014); } }
public static void traders_runoff(GameObject attachee) { AttachParticles("orb-summon-fire-elemental", PartyLeader); var gremag = Utilities.find_npc_near(attachee, 8049); var rannos = Utilities.find_npc_near(attachee, 8048); if (gremag != null) { gremag.RunOff(); } if (rannos != null) { rannos.RunOff(gremag.GetLocation().OffsetTiles(-3, 0)); } if (!PartyLeader.HasReputation(23)) { PartyLeader.AddReputation(23); } if (SelectedPartyLeader.GetMap() == 5051) { GameSystems.RandomEncounter.RemoveQueuedEncounter(3159); } attachee.Destroy(); return; }
public override void OnSpellEffect(SpellPacketBody spell) { Logger.Info("Produce Flame OnSpellEffect"); var(xx, yy) = spell.caster.GetLocation(); if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610)) { // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA AttachParticles("swirled gas", spell.caster); spell.caster.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red); Sound(7581, 1); Sound(7581, 1); } else { spell.duration = 10 * spell.casterLevel; if (spell.casterLevel > 5) { spell.casterLevel = 5; } var target = spell.Targets[0]; target.Object.AddCondition("sp-Produce Flame", spell.spellId, spell.duration, 0); target.ParticleSystem = AttachParticles("sp-Produce Flame", target.Object); } }
public static bool check_sleep_encounter(RandomEncounterQuery setup, RandomEncounter encounter) { if ((RandomRange(1, 10) == 1)) { encounter.Id = 4000; if ((SelectedPartyLeader.GetArea() == 1)) { return(false); } else if ((SelectedPartyLeader.GetArea() == 2)) { if ((SelectedPartyLeader.GetMap() == 5002)) { var enemy_list = new[] { (14057, 1, 3, 1), (14089, 2, 4, 1), (14291, 1, 4, 6), (14050, 2, 3, 1), (14094, 1, 2, 3), (14090, 2, 4, 1), (14056, 4, 9, 1), (14088, 1, 3, 1), (14047, 2, 4, 1), (14070, 2, 5, 1) };
public override bool OnInsertItem(GameObject attachee, GameObject triggerer) { if (((triggerer.GetNameId() == 8048) || (triggerer.GetNameId() == 8049) || (triggerer.GetNameId() == 1204))) { QueueRandomEncounter(3000); } else if (triggerer.GetNameId() == 1004 && SelectedPartyLeader.GetMap() == 5010) // 5010- Trader's shop { if (!GameSystems.RandomEncounter.IsEncounterQueued(3000)) { QueueRandomEncounter(3000); } } else if (triggerer.GetNameId() == 1001 && SelectedPartyLeader.GetMap() == 5001 && (new[] { 1, 3006, 4120, 6097, 6098, 6099, 6100 }).Contains(attachee.GetNameId())) // note: for some reason most of Lareth's item have a "name" field of 1, and another has 3006. Will be fixed in the future inside Protos.tab, for now this is a hotfix { GameObject bro_smith = null; foreach (var npc in ObjList.ListVicinity(triggerer.GetLocation(), ObjectListFilter.OLC_NPC)) { if (npc.GetNameId() == 20005) { bro_smith = npc; } } if (bro_smith == null) { return(SkipDefault); } GameObject pc_dude; if (Utilities.is_safe_to_talk(bro_smith, SelectedPartyLeader)) { pc_dude = SelectedPartyLeader; } else { pc_dude = Utilities.party_closest(bro_smith, true, 0); } if ((GetGlobalVar(452) & (0x40)) == 0) { if (pc_dude != null && pc_dude.type == ObjectType.pc) { var cur_money = pc_dude.GetMoney(); UiSystems.CharSheet.Hide(); StartTimer(450, () => smith_refund(cur_money), true); // give money back to Smith StartTimer(750, () => pc_give_item_back(pc_dude, attachee), true); // get item back SetGlobalVar(452, GetGlobalVar(452) | 0x40); pc_dude.BeginDialog(bro_smith, 1000); } } else if ((attachee.GetInt(obj_f.item_wear_flags) & 256) != 0 && attachee.GetScriptId(ObjScriptEvent.InsertItem) == 186) // Lareth's plate boots { var cur_money = pc_dude.GetMoney(); UiSystems.CharSheet.Hide(); StartTimer(450, () => smith_refund(cur_money), true); // give money back to Smith StartTimer(750, () => pc_give_item_back(pc_dude, attachee), true); // get item back pc_dude.BeginDialog(bro_smith, 1050); } } return(SkipDefault); }
public override void OnSpellEffect(SpellPacketBody spell) { Logger.Info("Flame Strike OnSpellEffect"); var remove_list = new List <GameObject>(); // damage is split between FIRE and DIVINE damage var dam = Dice.D6; dam = dam.WithCount(Math.Min(15, spell.casterLevel)); var dam_over2 = Dice.Constant(0); dam_over2 = dam_over2.WithModifier(dam.Roll() / 2); var(xx, yy) = spell.caster.GetLocation(); // caster is in chamber if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610)) { // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA AttachParticles("swirled gas", spell.caster); spell.caster.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red); Sound(7581, 1); Sound(7581, 1); foreach (var target_item in spell.Targets) { remove_list.Add(target_item.Object); } spell.EndSpell(); return; } (xx, yy) = spell.aoeCenter.location; // center of targeting circle in chamber if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610)) { // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA var tro = GameSystems.MapObject.CreateObject(14070, spell.aoeCenter); SpawnParticles("swirled gas", spell.aoeCenter); spell.caster.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red); tro.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red); tro.Destroy(); Sound(7581, 1); Sound(7581, 1); foreach (var target_item in spell.Targets) { remove_list.Add(target_item.Object); } spell.EndSpell(); return; } SpawnParticles("sp-Flame Strike", spell.aoeCenter); // get all targets in a 10ft radius var soundfizzle = 0; foreach (var target_item in spell.Targets) { (xx, yy) = target_item.Object.GetLocation(); // center of targeting circle in chamber if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610)) { // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA SpawnParticles("swirled gas", target_item.Object.GetLocation()); target_item.Object.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red); soundfizzle = 1; spell.RemoveTarget(target_item.Object); remove_list.Add(target_item.Object); continue; } // do reflex saving throw on FIRE damage, then do damage/save check for DIVINE damage if (target_item.Object.ReflexSaveAndDamage(spell.caster, spell.dc, D20SavingThrowReduction.Half, D20SavingThrowFlag.NONE, dam_over2, DamageType.Fire, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId)) { target_item.Object.FloatMesFileLine("mes/spell.mes", 30001); // check for evasion if ((!target_item.Object.HasFeat(FeatId.EVASION)) && (!target_item.Object.HasFeat(FeatId.IMPROVED_EVASION))) { // saving throw successful, apply half damage target_item.Object.DealReducedSpellDamage(spell.caster, DamageType.Magic, dam_over2, D20AttackPower.UNSPECIFIED, DAMAGE_REDUCTION_HALF, D20ActionType.CAST_SPELL, spell.spellId); } } else { target_item.Object.FloatMesFileLine("mes/spell.mes", 30002); if (!target_item.Object.HasFeat(FeatId.IMPROVED_EVASION)) { // saving throw unsuccessful, apply full damage target_item.Object.DealSpellDamage(spell.caster, DamageType.Magic, dam_over2, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId); } else { // saving throw successful, apply half damage because of IMPROVED EVASION target_item.Object.DealReducedSpellDamage(spell.caster, DamageType.Magic, dam_over2, D20AttackPower.UNSPECIFIED, DAMAGE_REDUCTION_HALF, D20ActionType.CAST_SPELL, spell.spellId); } } remove_list.Add(target_item.Object); } if (soundfizzle == 1) { Sound(7581, 1); Sound(7581, 1); } spell.RemoveTargets(remove_list); spell.EndSpell(); }
public override void OnSpellEffect(SpellPacketBody spell) { Logger.Info("Burning Hands OnSpellEffect"); var remove_list = new List <GameObject>(); var dam = Dice.D4; dam = dam.WithCount(Math.Min(5, spell.casterLevel)); if (spell.caster.GetNameId() == 14540) // Hell Hound's Breath Weapon { dam = Dice.Parse("2d6"); spell.dc = 13; } var(xx, yy) = spell.caster.GetLocation(); if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610)) { // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA AttachParticles("swirled gas", spell.caster); spell.caster.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red); Sound(7581, 1); Sound(7581, 1); } else { // else: # caster himself is outside Chamber, now check the targets: var soundfizzle = 0; AttachParticles("sp-Burning Hands", spell.caster); var npc = spell.caster; // Caster is NOT in game party if (npc.type != ObjectType.pc && npc.GetLeader() == null) { var range = 15; var target_list = ObjList.ListCone(spell.caster, ObjectListFilter.OLC_CRITTERS, range, -30, 150); foreach (var obj in target_list) { if (obj == spell.caster) { continue; } (xx, yy) = obj.GetLocation(); if (obj.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610)) { obj.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red); SpawnParticles("swirled gas", obj.GetLocation()); soundfizzle = 1; } else { if (obj.ReflexSaveAndDamage(spell.caster, spell.dc, D20SavingThrowReduction.Half, D20SavingThrowFlag.NONE, dam, DamageType.Fire, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId)) { // saving throw successful obj.FloatMesFileLine("mes/spell.mes", 30001); } else { // saving throw unsuccessful obj.FloatMesFileLine("mes/spell.mes", 30002); } } } } // Caster is in game party if (npc.type == ObjectType.pc || npc.GetLeader() != null) { // get all targets in a 10ft cone (180') soundfizzle = 0; foreach (var target_item in spell.Targets) { remove_list.Add(target_item.Object); (xx, yy) = target_item.Object.GetLocation(); if (target_item.Object.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610)) { // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA target_item.Object.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red); SpawnParticles("swirled gas", target_item.Object.GetLocation()); soundfizzle = 1; spell.RemoveTarget(target_item.Object); } else { if (target_item.Object.ReflexSaveAndDamage(spell.caster, spell.dc, D20SavingThrowReduction.Half, D20SavingThrowFlag.NONE, dam, DamageType.Fire, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId)) { // saving throw successful target_item.Object.FloatMesFileLine("mes/spell.mes", 30001); } else { // saving throw unsuccessful target_item.Object.FloatMesFileLine("mes/spell.mes", 30002); } } } } if (soundfizzle == 1) { Sound(7581, 1); Sound(7581, 1); } } spell.RemoveTargets(remove_list); spell.EndSpell(); }
public override void OnSpellEffect(SpellPacketBody spell) { Logger.Info("Cone of Cold OnSpellEffect"); var remove_list = new List <GameObject>(); var dam = Dice.D6; dam = dam.WithCount(Math.Min(15, spell.casterLevel)); if (Co8Settings.ElementalSpellsAtElementalNodes) { if (SelectedPartyLeader.GetMap() == 5083) // Fire node - water spells do 1/2 damage { dam = dam.WithCount(dam.Count / 2); } else if (SelectedPartyLeader.GetMap() == 5084) // Water node - water spells do X2 damage { dam = dam.WithCount(dam.Count * 2); } } AttachParticles("sp-Cone of Cold", spell.caster); var npc = spell.caster; // Caster is NOT in game party if (npc.type != ObjectType.pc && npc.GetLeader() == null) { // range = 25 + 5 * int(spell.caster_level/2) var range = 60; var target_list = ObjList.ListCone(spell.caster, ObjectListFilter.OLC_CRITTERS, range, -30, 60); foreach (var obj in target_list) { if (obj == spell.caster) { continue; } if (obj.ReflexSaveAndDamage(spell.caster, spell.dc, D20SavingThrowReduction.Half, D20SavingThrowFlag.NONE, dam, DamageType.Cold, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId)) { // saving throw successful obj.FloatMesFileLine("mes/spell.mes", 30001); } else { // saving throw unsuccessful obj.FloatMesFileLine("mes/spell.mes", 30002); } } } // Caster is in game party if (npc.type == ObjectType.pc || npc.GetLeader() != null) { // get all targets in a 25ft + 2ft/level cone (60') foreach (var target_item in spell.Targets) { if (target_item.Object.ReflexSaveAndDamage(spell.caster, spell.dc, D20SavingThrowReduction.Half, D20SavingThrowFlag.NONE, dam, DamageType.Cold, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId)) { // saving throw successful target_item.Object.FloatMesFileLine("mes/spell.mes", 30001); } else { // saving throw unsuccessful target_item.Object.FloatMesFileLine("mes/spell.mes", 30002); } remove_list.Add(target_item.Object); } } spell.RemoveTargets(remove_list); spell.EndSpell(); }
public override void OnSpellEffect(SpellPacketBody spell) { Logger.Info("Fire Shield OnSpellEffect"); // Solves Radial menu problem for Wands/NPCs var spell_arg = spell.GetMenuArg(RadialMenuParam.MinSetting); if (spell_arg != 1 && spell_arg != 2) { spell_arg = RandomRange(1, 2); } SpellDescriptor element_type; string partsys_type; if (spell_arg == 1) { element_type = SpellDescriptor.COLD; partsys_type = "sp-Fire Shield-Cold"; } else if (spell_arg == 2) { element_type = SpellDescriptor.FIRE; partsys_type = "sp-Fire Shield-Warm"; } else { Logger.Error("Fire shield cast with an unknown spell arg: {0}", spell_arg); return; } spell.duration = 1 * spell.casterLevel; var npc = spell.caster; // added so NPC's can use wand/potion/scroll if (npc.type != ObjectType.pc && npc.GetLeader() == null && spell.duration <= 0) { spell.duration = 10; spell.casterLevel = 10; } var target_item = spell.Targets[0]; var(xx, yy) = target_item.Object.GetLocation(); if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610)) { // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA AttachParticles("swirled gas", target_item.Object); target_item.Object.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red); Sound(7581, 1); Sound(7581, 1); } else { (xx, yy) = spell.caster.GetLocation(); if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610)) { AttachParticles("swirled gas", spell.caster); spell.caster.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red); Sound(7581, 1); Sound(7581, 1); } else { target_item.Object.AddCondition("sp-Fire Shield", spell.spellId, spell.duration, element_type); target_item.ParticleSystem = AttachParticles(partsys_type, target_item.Object); } } }
public override void OnSpellEffect(SpellPacketBody spell) { Logger.Info("Fire Storm OnSpellEffect"); var remove_list = new List <GameObject>(); var damage_list = new List <GameObject>(); var dam = Dice.D6; dam = dam.WithCount(Math.Min(20, spell.casterLevel)); var(xx, yy) = spell.caster.GetLocation(); // caster is in chamber if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610)) { // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA AttachParticles("swirled gas", spell.caster); spell.caster.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red); Sound(7581, 1); Sound(7581, 1); spell.EndSpell(); return; } foreach (var target_item in spell.Targets) { (xx, yy) = target_item.Object.GetLocation(); // target in chamber if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610)) { // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA var tro = GameSystems.MapObject.CreateObject(14070, target_item.Object.GetLocation()); SpawnParticles("swirled gas", target_item.Object.GetLocation()); // spell.caster.float_mesfile_line( 'mes\\skill_ui.mes', 2000 , 1 ) tro.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red); tro.Destroy(); Sound(7581, 1); Sound(7581, 1); remove_list.Add(target_item.Object); continue; } else { // create a rectangle around target for two 10 x 10 ft. cubes (10 x 20 ft. area of effect) var(target_xx, target_yy) = target_item.Object.GetLocation(); // generate location of the rectangle (centered on the target) and randomize the placement of it (since you can not place it) var a = RandomRange(1, 2); var b = RandomRange(1, 2); int targetX, targetY; if (a == 1) { targetX = 5; if (b == 1) { targetY = 7; } else { targetY = 10; } } else { targetY = 5; if (b == 1) { targetX = 7; } else { targetX = 10; } } SpawnParticles("sp-Flame Strike", new locXY(target_xx - (int)(targetX / 2), target_yy - (int)(targetY / 2))); SpawnParticles("sp-Flame Strike", new locXY(target_xx + (int)(targetX / 2), target_yy + (int)(targetY / 2))); // create damage list foreach (var critter in ObjList.ListVicinity(target_item.Object.GetLocation(), ObjectListFilter.OLC_CRITTERS)) { (xx, yy) = critter.GetLocation(); if ((xx >= (target_xx - targetX) && xx <= (target_xx + targetX)) && (yy >= (target_yy - targetY) && yy <= (target_yy + targetY))) { if (critter.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610)) { // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA critter.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red); AttachParticles("swirled gas", critter); Sound(7581, 1); Sound(7581, 1); continue; } else { if (!(damage_list).Contains(critter)) { damage_list.Add(critter); } } } } } remove_list.Add(target_item.Object); } // deal damage foreach (var damage_target in damage_list) { if (!damage_target.D20Query(D20DispatcherKey.QUE_Dead)) { AttachParticles("hit-FIRE-burst", damage_target); if (damage_target.ReflexSaveAndDamage(spell.caster, spell.dc, D20SavingThrowReduction.Half, D20SavingThrowFlag.NONE, dam, DamageType.Fire, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId)) { // saving throw successful damage_target.FloatMesFileLine("mes/spell.mes", 30001); } else { // saving throw unsuccessful damage_target.FloatMesFileLine("mes/spell.mes", 30002); } } } spell.RemoveTargets(remove_list); spell.EndSpell(); }
public override void OnSpellEffect(SpellPacketBody spell) { Logger.Info("Delayed Blast Fireball OnSpellEffect"); AttachParticles("sp-Fireball-conjure", spell.caster); var remove_list = new List <GameObject>(); var dam = Dice.D6; dam = dam.WithCount(Math.Min(20, spell.casterLevel)); // edited by Allyx if (Co8Settings.ElementalSpellsAtElementalNodes) { if (SelectedPartyLeader.GetMap() == 5083) // Fire node - fire spells do x2 damage { dam = dam.WithCount(dam.Count * 2); } else if (SelectedPartyLeader.GetMap() == 5084) // Water node - fire spells do 1/2 damage { dam = dam.WithCount(dam.Count / 2); } } var(xx, yy) = spell.aoeCenter.location; if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610)) { // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA var tro = GameSystems.MapObject.CreateObject(14070, spell.aoeCenter); SpawnParticles("swirled gas", spell.aoeCenter); tro.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red); tro.Destroy(); Sound(7581, 1); Sound(7581, 1); foreach (var target_item in spell.Targets) { remove_list.Add(target_item.Object); } spell.RemoveTargets(remove_list); spell.EndSpell(); return; } SpawnParticles("sp-Fireball-Hit", spell.aoeCenter); var soundfizzle = 0; foreach (var target_item in spell.Targets) { (xx, yy) = target_item.Object.GetLocation(); if (target_item.Object.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610)) { // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA target_item.Object.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red); AttachParticles("swirled gas", target_item.Object); soundfizzle = 1; remove_list.Add(target_item.Object); continue; } if (target_item.Object.ReflexSaveAndDamage(spell.caster, spell.dc, D20SavingThrowReduction.Half, D20SavingThrowFlag.NONE, dam, DamageType.Fire, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId)) { // saving throw successful target_item.Object.FloatMesFileLine("mes/spell.mes", 30001); } else { // saving throw unsuccessful target_item.Object.FloatMesFileLine("mes/spell.mes", 30002); } remove_list.Add(target_item.Object); } if (soundfizzle == 1) { Sound(7581, 1); Sound(7581, 1); } spell.RemoveTargets(remove_list); spell.EndSpell(); }
public override void OnEndProjectile(SpellPacketBody spell, GameObject projectile, int index_of_target) { Logger.Info("Fireball OnEndProjectile"); var remove_list = new List <GameObject>(); spell.duration = 0; var dam = Dice.D6; dam = dam.WithCount(Math.Min(10, spell.casterLevel)); if (Co8Settings.ElementalSpellsAtElementalNodes) { if (SelectedPartyLeader.GetMap() == 5083) // Fire node - fire spells do double damage { dam = dam.WithCount(dam.Count * 2); } else if (SelectedPartyLeader.GetMap() == 5084) // Water node - fire spells do half damage { dam = dam.WithCount(dam.Count / 2); } } EndProjectileParticles(projectile); var(xx, yy) = spell.aoeCenter.location; if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610)) { // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA // This is for the projectile hitting inside the chamber - total fizzle var tro = GameSystems.MapObject.CreateObject(14070, spell.aoeCenter); SpawnParticles("swirled gas", spell.aoeCenter); tro.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red); tro.Destroy(); Sound(7581, 1); Sound(7581, 1); foreach (var target_item in spell.Targets) { remove_list.Add(target_item.Object); } } else { // else: # suppose the fireball projectile lands outside the chamber, check individual targets SpawnParticles("sp-Fireball-Hit", spell.aoeCenter); var soundfizzle = 0; foreach (var target_item in spell.Targets) { (xx, yy) = target_item.Object.GetLocation(); if (target_item.Object.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610)) { // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA SpawnParticles("swirled gas", target_item.Object.GetLocation()); target_item.Object.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red); soundfizzle = 1; spell.RemoveTarget(target_item.Object); } else { if (target_item.Object.ReflexSaveAndDamage(spell.caster, spell.dc, D20SavingThrowReduction.Half, D20SavingThrowFlag.NONE, dam, DamageType.Fire, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId)) { // saving throw successful target_item.Object.FloatMesFileLine("mes/spell.mes", 30001); } else { // saving throw unsuccessful target_item.Object.FloatMesFileLine("mes/spell.mes", 30002); } } remove_list.Add(target_item.Object); } if (soundfizzle == 1) { Sound(7581, 1); Sound(7581, 1); } } spell.RemoveTargets(remove_list); spell.EndSpell(); }
public static void council_events() { // this script is fired from first_heartbeat in the Hommlet Exterior map 5001 if ((SelectedPartyLeader.GetMap() == 5001 && GetGlobalVar(435) == 4 && !GetGlobalFlag(435) && GetGlobalFlag(432))) { // spawns everyone that was inside Towne Hall SetGlobalFlag(435, true); var burne = GameSystems.MapObject.CreateObject(14453, new locXY(578, 406)); burne.RemoveScript(ObjScriptEvent.FirstHeartbeat); burne.RemoveScript(ObjScriptEvent.Heartbeat); burne.SetInt(obj_f.critter_description_unknown, 20000); burne.Move(new locXY(578, 406), 0f, 0f); burne.Rotation = 1; ScriptDaemon.destroy_weapons(burne, 4058, 0, 0); var jaroo = GameSystems.MapObject.CreateObject(14005, new locXY(583, 412)); jaroo.RemoveScript(ObjScriptEvent.FirstHeartbeat); jaroo.RemoveScript(ObjScriptEvent.Heartbeat); jaroo.SetInt(obj_f.critter_description_unknown, 20001); jaroo.Move(new locXY(583, 412), 0f, 0f); jaroo.Rotation = 0; ScriptDaemon.destroy_weapons(jaroo, 4047, 4111, 0); var rufus = GameSystems.MapObject.CreateObject(14006, new locXY(571, 407)); rufus.RemoveScript(ObjScriptEvent.FirstHeartbeat); rufus.RemoveScript(ObjScriptEvent.Heartbeat); rufus.SetInt(obj_f.critter_description_unknown, 8071); rufus.Move(new locXY(571, 407), 0f, 0f); rufus.Rotation = 3; var terjon = GameSystems.MapObject.CreateObject(14007, new locXY(570, 412)); terjon.RemoveScript(ObjScriptEvent.FirstHeartbeat); terjon.RemoveScript(ObjScriptEvent.Heartbeat); terjon.SetInt(obj_f.critter_description_unknown, 20003); terjon.Move(new locXY(570, 412), 0f, 0f); terjon.Rotation = 4.5f; ScriptDaemon.destroy_weapons(terjon, 4124, 6054, 0); var renton = GameSystems.MapObject.CreateObject(14012, new locXY(583, 409)); renton.RemoveScript(ObjScriptEvent.FirstHeartbeat); renton.RemoveScript(ObjScriptEvent.Heartbeat); renton.SetInt(obj_f.critter_description_unknown, 20007); renton.Move(new locXY(583, 409), 0f, 0f); renton.Rotation = 1; ScriptDaemon.destroy_weapons(renton, 4096, 4036, 6074); var nevets = GameSystems.MapObject.CreateObject(14102, new locXY(576, 407)); nevets.RemoveScript(ObjScriptEvent.FirstHeartbeat); nevets.RemoveScript(ObjScriptEvent.Heartbeat); nevets.SetInt(obj_f.critter_description_unknown, 20058); nevets.Move(new locXY(576, 407), 0f, 0f); nevets.Rotation = 3; var miller = GameSystems.MapObject.CreateObject(14031, new locXY(571, 412)); miller.RemoveScript(ObjScriptEvent.FirstHeartbeat); miller.RemoveScript(ObjScriptEvent.Heartbeat); miller.SetInt(obj_f.critter_description_unknown, 20026); miller.Move(new locXY(571, 412), 3f, 0f); miller.Rotation = 3; miller.AddCondition("Prone", 0, 0); var gundi = GameSystems.MapObject.CreateObject(14016, new locXY(582, 411)); gundi.RemoveScript(ObjScriptEvent.FirstHeartbeat); gundi.RemoveScript(ObjScriptEvent.Heartbeat); gundi.SetInt(obj_f.critter_description_unknown, 20011); gundi.Move(new locXY(582, 411), -10f, -10f); gundi.Rotation = 3; gundi.AddCondition("Prone", 0, 0); var crybaby = GameSystems.MapObject.CreateObject(14002, new locXY(575, 417)); crybaby.Move(new locXY(575, 417), 0f, 0f); crybaby.RemoveScript(ObjScriptEvent.FirstHeartbeat); crybaby.RemoveScript(ObjScriptEvent.Heartbeat); crybaby.Rotation = 5.5f; crybaby.RemoveScript(ObjScriptEvent.Heartbeat); crybaby.ClearObjectFlag(ObjectFlag.OFF); if ((GetGlobalVar(436) == 4)) { StartTimer(2000, () => proactivity(crybaby, 3000)); } else { StartTimer(7000, () => proactivity(crybaby, 3000)); } var randy1 = RandomRange(1, 2); randy1 = 2; // remove randomness for testing purposes if ((randy1 == 1)) { var gremag = GameSystems.MapObject.CreateObject(14014, new locXY(365, 653)); gremag.AddCondition("Invisible", 0, 0); gremag.SetObjectFlag(ObjectFlag.DONTDRAW); var rannos = GameSystems.MapObject.CreateObject(14018, new locXY(366, 655)); rannos.AddCondition("Invisible", 0, 0); rannos.SetObjectFlag(ObjectFlag.DONTDRAW); var dlg_popup = GameSystems.MapObject.CreateObject(14806, new locXY(364, 653)); } else { var gremag = GameSystems.MapObject.CreateObject(14014, new locXY(318, 495)); gremag.AddCondition("Invisible", 0, 0); gremag.SetObjectFlag(ObjectFlag.DONTDRAW); var rannos = GameSystems.MapObject.CreateObject(14018, new locXY(320, 496)); rannos.AddCondition("Invisible", 0, 0); rannos.SetObjectFlag(ObjectFlag.DONTDRAW); var dlg_popup = GameSystems.MapObject.CreateObject(14806, new locXY(317, 494)); } // dlg_popup.object_flag_unset(OF_DONTDRAW) // dlg_popup.object_flag_unset(OF_CLICK_THROUGH) // damage section, tough ones: if ((GetGlobalVar(436) != 4)) { lightly_damage(renton); lightly_damage(terjon); lightly_damage(rufus); lightly_damage(jaroo); lightly_damage(burne); StartTimer(8500, () => heal_script(terjon, rufus)); StartTimer(9500, () => heal_script(jaroo, renton)); } // damage section, frail but important ones: if ((GetGlobalVar(436) != 4)) { if ((GetGlobalVar(436) != 6 && GetGlobalVar(436) != 7)) { lightly_damage(nevets); lightly_damage(gundi); StartTimer(700, () => heal_script(jaroo, gundi)); StartTimer(5800, () => heal_script(jaroo, nevets)); } else { heavily_damage(nevets); heavily_damage(gundi); } } // damage section, frail and unimportant ones: if ((ScriptDaemon.get_v(436) != 4)) { if ((ScriptDaemon.get_v(436) == 3)) { lightly_damage(miller); StartTimer(3500, () => float_comment(terjon, 3000)); StartTimer(3510, () => heal_script(terjon, miller)); } else { heavily_damage(miller); } } } return; }
public static bool should_display_dialog_node(string node_name) { var cur_map = SelectedPartyLeader.GetMap(); if (node_name == "Temple Entrance") { if (cur_map == 5064) { return(false); } } else if (node_name == "Temple Tower Exterior") { if (cur_map == 5113) { return(false); } if (ScriptDaemon.get_f("visited_temple_tower_exterior")) { return(true); } } else if (node_name == "More Upper Proper") { var option_count = 0; if (cur_map != 5064) { option_count += 1; } if (cur_map != 5113 && ScriptDaemon.get_f("visited_temple_tower_exterior")) { option_count += 1; } if (cur_map != 5065 && ScriptDaemon.get_f("visited_temple_tower_interior")) { option_count += 1; } if (cur_map != 5093 && ScriptDaemon.get_f("visited_temple_burnt_farmhouse")) { option_count += 1; } if (cur_map != 5092 && ScriptDaemon.get_f("visited_temple_escape_tunnel")) { option_count += 1; } if (cur_map != 5112 && ScriptDaemon.get_f("visited_temple_ruined_building")) { option_count += 1; } return(option_count >= 5); } else if (node_name == "Level 1") { if (cur_map == 5066) { return(false); } if (ScriptDaemon.get_f("visited_level_1_north_entrance") || ScriptDaemon.get_f("visited_level_1_south_entrance") || ScriptDaemon.get_f("visited_level_1_south_entrance") || SelectedPartyLeader.HasReputation(11) || ScriptDaemon.get_f("visited_secret_spiral_staircase")) { return(true); } } else if (node_name == "Level 1 - North") { if (ScriptDaemon.get_f("visited_level_1_north_entrance")) { return(true); } } else if (node_name == "Level 1 - South") { if (ScriptDaemon.get_f("visited_level_1_south_entrance")) { return(true); } } else if (node_name == "Level 1 - Romag") { if (SelectedPartyLeader.HasReputation(11)) { return(true); } } else if (node_name == "Secret Spiral Staircase") { if (ScriptDaemon.get_f("visited_secret_spiral_staircase")) { return(true); } } else if (node_name == "Level 2") { if (cur_map == 5067) { return(false); } if (ScriptDaemon.get_f("visited_level_2_north_west_entrance") || ScriptDaemon.get_f("visited_level_2_centre_entrance") || SelectedPartyLeader.HasReputation(13) || SelectedPartyLeader.HasReputation(12) || SelectedPartyLeader.HasReputation(10)) { return(true); } } else if (node_name == "Level 2 - North West") { if (ScriptDaemon.get_f("visited_level_2_north_west_entrance")) { return(true); } } else if (node_name == "Level 2 - Centre") { if (ScriptDaemon.get_f("visited_level_2_centre_entrance")) { return(true); } } else if (node_name == "Level 2 - Alrrem") { if (SelectedPartyLeader.HasReputation(13)) { return(true); } } else if (node_name == "Level 2 - Belsornig") { if (SelectedPartyLeader.HasReputation(12)) { return(true); } } else if (node_name == "Level 2 - Kelno") { if (SelectedPartyLeader.HasReputation(10)) { return(true); } } else if (node_name == "Level 2 More") { var option_count = 0; if (ScriptDaemon.get_f("visited_level_2_north_west_entrance")) { option_count += 1; } if (ScriptDaemon.get_f("visited_level_2_centre_entrance")) { option_count += 1; } if (SelectedPartyLeader.HasReputation(13)) { option_count += 1; } if (SelectedPartyLeader.HasReputation(12)) { option_count += 1; } if (SelectedPartyLeader.HasReputation(10)) { option_count += 1; } return(option_count >= 5); } else if (node_name == "Secret Spiral Staircase") { if (ScriptDaemon.get_f("visited_secret_spiral_staircase")) { return(true); } } else if (node_name == "Level 3") { if (cur_map == 5105) { return(false); } if (ScriptDaemon.get_f("visited_level_3_east_entrance") || ScriptDaemon.get_f("visited_level_3_west_entrance") || ScriptDaemon.get_f("visited_level_3_south_west_entrance") || ScriptDaemon.get_f("visited_level_3_falrinth")) { return(true); } } else if (node_name == "Level 3 - East") { if (ScriptDaemon.get_f("visited_level_3_east_entrance")) { return(true); } } else if (node_name == "Level 3 - West") { if (ScriptDaemon.get_f("visited_level_3_west_entrance")) { return(true); } } else if (node_name == "Level 3 - South") { if (ScriptDaemon.get_f("visited_level_3_south_west_entrance")) { return(true); } } else if (node_name == "Level 3 - Falrinth") { if (ScriptDaemon.get_f("visited_level_3_falrinth")) { return(true); } } else if (node_name == "Level 4") { if (cur_map == 5080) { return(false); } if (ScriptDaemon.get_f("visited_level_4_main_entrance") || ScriptDaemon.get_f("visited_level_4_nexus") || ScriptDaemon.get_f("visited_level_4_hedrack")) { return(true); } } else if (node_name == "Level 4 - Main") { if (ScriptDaemon.get_f("visited_level_4_main_entrance")) { return(true); } } else if (node_name == "Level 4 - Nexus") { if (ScriptDaemon.get_f("visited_level_4_nexus")) { return(true); } } else if (node_name == "Level 4 - Hedrack") { if (ScriptDaemon.get_f("visited_level_4_hedrack")) { return(true); } } else if (node_name == "Nodes") { if (ScriptDaemon.get_f("visited_air_node") || ScriptDaemon.get_f("visited_earth_node") || ScriptDaemon.get_f("visited_fire_node") || ScriptDaemon.get_f("visited_water_node")) { return(true); } } else if (node_name == "Air Node") { if (ScriptDaemon.get_f("visited_air_node")) { return(true); } } else if (node_name == "Earth Node") { if (ScriptDaemon.get_f("visited_earth_node")) { return(true); } } else if (node_name == "Fire Node") { if (ScriptDaemon.get_f("visited_fire_node")) { return(true); } } else if (node_name == "Water Node") { if (ScriptDaemon.get_f("visited_water_node")) { return(true); } } else if (node_name == "Zuggtmoy Level") { if (cur_map == 5079) { return(false); } if (ScriptDaemon.get_f("visited_zuggtmoy_level")) { return(true); } } return(true); }