summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesusaves <cpntb1@ymail.com>2020-05-22 11:26:21 -0300
committerJesusaves <cpntb1@ymail.com>2020-05-22 11:26:21 -0300
commit94d1a9342e80e311eb8b1fe7b49cb40a103055ff (patch)
tree06722fc267bfc53a398039977f84fce3e20fdfa1
parent26136e118ebc431f70a0a0c8dd6f809b8b620359 (diff)
downloadevol-hercules-94d1a9342e80e311eb8b1fe7b49cb40a103055ff.tar.gz
evol-hercules-94d1a9342e80e311eb8b1fe7b49cb40a103055ff.tar.bz2
evol-hercules-94d1a9342e80e311eb8b1fe7b49cb40a103055ff.tar.xz
evol-hercules-94d1a9342e80e311eb8b1fe7b49cb40a103055ff.zip
New builtin: harm()
Effect: Causes damage :> WARNING: Magic Damage is currently a joke >__>
-rw-r--r--src/emap/init.c1
-rw-r--r--src/emap/script_buildins.c101
-rw-r--r--src/emap/script_buildins.h1
3 files changed, 103 insertions, 0 deletions
diff --git a/src/emap/init.c b/src/emap/init.c
index 6a34ee6..7ad68b9 100644
--- a/src/emap/init.c
+++ b/src/emap/init.c
@@ -236,6 +236,7 @@ HPExport void plugin_init (void)
addScriptCommand("npcshopattach","s?",npcshopattach);
addScriptCommand("instanceowner", "i", InstanceOwner);
addScriptCommand("aggravate", "i", aggravate);
+ addScriptCommand("harm", "ii?", harm);
addScriptCommand("resetrng", "", resetrng);
// Overrides
diff --git a/src/emap/script_buildins.c b/src/emap/script_buildins.c
index f29a2a4..3e53dfe 100644
--- a/src/emap/script_buildins.c
+++ b/src/emap/script_buildins.c
@@ -16,6 +16,7 @@
#include "common/random.h"
#include "map/achievement.h"
#include "map/atcommand.h"
+#include "map/battle.h"
#include "map/chat.h"
#include "map/chrif.h"
#include "map/guild.h"
@@ -3087,6 +3088,106 @@ BUILDIN(aggravate)
return true;
}
+// Like heal() but works against anything (casts battle funcs)
+// types: 1- physical; 2- magic; 4 - misc, default
+// harm(guid, rawdmg, type)
+BUILDIN(harm)
+{
+ struct block_list *bl;
+ struct map_session_data *sd = NULL;
+ struct block_list *src;
+
+ // Target and raw damage
+ bl = map->id2bl(script_getnum(st, 2));
+ int dmg = script_getnum(st, 3);
+
+ // Attack type
+ int attack_type = BF_MISC;
+ if (script_hasdata(st,4)) {
+ attack_type = script_getnum(st,4);
+ }
+
+ // Nullity checks
+ if (bl == NULL) {
+ ShowWarning("buildin_harm: Error in finding object with given GID %d!\n", script_getnum(st, 2));
+ script_pushint(st, 0);
+ return false;
+ }
+ if( dmg == INT_MIN ) dmg++;
+ if( dmg == INT_MAX ) dmg--;
+
+ // Source (sd), might be null, in this case we set source to yourself
+ sd = script->rid2sd(st);
+ if (sd == NULL) {
+ src = bl;
+ } else {
+ src = &sd->bl;
+ }
+
+ // Damage struct
+ struct Damage d;
+ switch(attack_type) {
+ case BF_WEAPON: d = battle->calc_weapon_attack(src, bl, 0,0,0); break;
+ case BF_MAGIC: d = battle->calc_magic_attack(src, bl, 0,0,0); break;
+ case BF_MISC: d.damage=d.damage2=dmg; d.flag=BF_MISC; break;
+ default:
+ ShowError("harm: unknown attack type! %d\n",attack_type);
+ memset(&d,0,sizeof(d));
+ break;
+ }
+
+ // Update raw damage with real damage
+ dmg = d.damage;
+
+ // Apply the damage, skip any other checks or whatelse
+ if ( dmg ) {
+ if (dmg < 0)
+ status->heal(bl, -dmg, 0, STATUS_HEAL_DEFAULT);
+ else {
+ // status_damage(struct block_list *src, struct block_list *target, int64 in_hp, int64 in_sp, int walkdelay, int flag)
+ status->damage(src, bl, dmg, 0, 0, 0);
+ clif->damage(src, bl, 0, 0, dmg, 0, BDT_ENDURE, 0);
+ }
+ }
+
+ /*
+ switch (bl->type) {
+ case BL_MOB:
+ struct mob_data *md = BL_UCAST(BL_MOB, bl);
+ nullpo_retr(false, md);
+ break;
+ case BL_HOM:
+ struct homun_data *hd = BL_UCAST(BL_HOM, bl);
+ nullpo_retr(false, hd);
+ break;
+ case BL_PET:
+ struct pet_data *pd = BL_UCAST(BL_PET, bl);
+ nullpo_retr(false, pd);
+ break;
+ case BL_MER:
+ struct mercenary_data *mc = BL_UCAST(BL_MER, bl);
+ nullpo_retr(false, mc);
+ break;
+ case BL_ELEM:
+ struct elemental_data *ed = BL_UCAST(BL_ELEM, bl);
+ nullpo_retr(false, ed);
+ break;
+ case BL_NPC:
+ struct npc_data *nd = BL_UCAST(BL_NPC, bl);
+ nullpo_retr(false, nd);
+ break;
+ default:
+ ShowError("buildin_harm: Unknown object!\n");
+ script_pushint(st, 0);
+ return false;
+ break;
+ }
+ */
+
+ script_pushint(st, dmg);
+ return true;
+}
+
/*==========================================
* Resets RNG seed
diff --git a/src/emap/script_buildins.h b/src/emap/script_buildins.h
index 685dabd..716f332 100644
--- a/src/emap/script_buildins.h
+++ b/src/emap/script_buildins.h
@@ -120,6 +120,7 @@ BUILDIN(homstatus);
BUILDIN(readparam2);
BUILDIN(InstanceOwner);
BUILDIN(aggravate);
+BUILDIN(harm);
BUILDIN(resetrng);
// Overrides