summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt5
-rw-r--r--src/map/charcommand.c2
-rw-r--r--src/map/clif.c2
-rw-r--r--src/map/mob.c4
-rw-r--r--src/map/npc.c4
-rw-r--r--src/map/npc.h1
-rw-r--r--src/map/script.c19
7 files changed, 27 insertions, 10 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 6c414e0af..4c373bf71 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -4,6 +4,11 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2007/03/12
+ * Added player not attached crash prevention to countitem/countitem2.
+ * Probably corrected delitem not deleting pet eggs at all.
+ * Hopefully fixed hidenpc/disablenpc not working on Guild flag sprites.
+ * Mob skill state "anytarget" no longer triggers when the mob has an
+ item-target (looting).
* @storage/@gstorage will no longer work if you have a trade or a storage
opened already.
* Corrected script command movenpc so it properly moves the ontouch npc
diff --git a/src/map/charcommand.c b/src/map/charcommand.c
index a3c546ab7..5eb03dd1f 100644
--- a/src/map/charcommand.c
+++ b/src/map/charcommand.c
@@ -1255,7 +1255,7 @@ int charcommand_fakename(
return -1;
}
- if(strlen(name) < 1 || !name) {
+ if(!name[0]) {
if(strlen(pl_sd->fakename) > 1) {
pl_sd->fakename[0]='\0';
clif_charnameack(0, &pl_sd->bl);
diff --git a/src/map/clif.c b/src/map/clif.c
index 977934afc..bcfae2bf2 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -942,7 +942,7 @@ static int clif_set0078(struct block_list *bl, struct view_data *vd, unsigned ch
WBUFW(buf,14)=vd->class_;
WBUFW(buf,16)=vd->hair_style; //Required for pets.
WBUFW(buf,20)=vd->head_bottom; //Pet armor
- if (bl->type == BL_NPC && vd->class_ == 722)
+ if (bl->type == BL_NPC && vd->class_ == FLAG_CLASS)
{ //The hell, why flags work like this?
WBUFL(buf,22)=emblem_id;
WBUFL(buf,26)=guild_id;
diff --git a/src/map/mob.c b/src/map/mob.c
index db519fce9..ee7dfa8c3 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -2699,8 +2699,8 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event)
c2 = ms[i].cond2;
if (ms[i].state != md->state.skillstate) {
- if (md->state.skillstate != MSS_DEAD && (
- ms[i].state == MSS_ANY || (ms[i].state == MSS_ANYTARGET && md->target_id)
+ if (md->state.skillstate != MSS_DEAD && (ms[i].state == MSS_ANY ||
+ (ms[i].state == MSS_ANYTARGET && md->target_id && md->state.skillstate != MSS_LOOT)
)) //ANYTARGET works with any state as long as there's a target. [Skotlex]
;
else
diff --git a/src/map/npc.c b/src/map/npc.c
index 2538a1955..cb104c11b 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -130,8 +130,8 @@ int npc_enable(const char *name,int flag)
else //Can't change the view_data to invisible class because the view_data for all npcs is shared! [Skotlex]
nd->sc.option|= OPTION_INVISIBLE;
- if (nd->class_ == WARP_CLASS)
- { //Client won't display option changes for warp portals [Toms]
+ if (nd->class_ == WARP_CLASS || nd->class_ == FLAG_CLASS)
+ { //Client won't display option changes for these classes [Toms]
if (nd->sc.option&(OPTION_HIDE|OPTION_INVISIBLE))
clif_clearchar(&nd->bl, 0);
else
diff --git a/src/map/npc.h b/src/map/npc.h
index 93b9b21d1..f4c092dc0 100644
--- a/src/map/npc.h
+++ b/src/map/npc.h
@@ -8,6 +8,7 @@
#define WARP_CLASS 45
#define WARP_DEBUG_CLASS 722
+#define FLAG_CLASS 722
#define INVISIBLE_CLASS 32767
#define MAX_NPC_CLASS 1000
diff --git a/src/map/script.c b/src/map/script.c
index 9b15497bc..11f5c6dda 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -5263,6 +5263,11 @@ BUILDIN_FUNC(countitem)
sd = script_rid2sd(st);
+ if (!sd) {
+ push_val(st->stack,C_INT,0);
+ return 0;
+ }
+
data=&(st->stack->stack_data[st->start+2]);
get_val(st,data);
if( data->type==C_STR || data->type==C_CONSTSTR ){
@@ -5303,6 +5308,11 @@ BUILDIN_FUNC(countitem2)
sd = script_rid2sd(st);
+ if (!sd) {
+ push_val(st->stack,C_INT,0);
+ return 0;
+ }
+
data=&(st->stack->stack_data[st->start+2]);
get_val(st,data);
if( data->type==C_STR || data->type==C_CONSTSTR ){
@@ -5737,9 +5747,9 @@ BUILDIN_FUNC(delitem)
if(sd->inventory_data[i]->type==IT_PETEGG &&
sd->status.inventory[i].card[0] == CARD0_PET)
{
- if (intif_delete_petdata(MakeDWord(sd->status.inventory[i].card[1], sd->status.inventory[i].card[2])))
+ if (!intif_delete_petdata(MakeDWord(sd->status.inventory[i].card[1], sd->status.inventory[i].card[2])))
continue; //pet couldn't be sent for deletion.
- }
+ } else
//is this item important? does it have cards? or Player's name? or Refined/Upgraded
if(itemdb_isspecial(sd->status.inventory[i].card[0]) ||
sd->status.inventory[i].card[0] ||
@@ -10468,14 +10478,15 @@ BUILDIN_FUNC(skilleffect)
*/
BUILDIN_FUNC(npcskilleffect)
{
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
+ struct block_list *bl= map_id2bl(st->oid);
int skillid=conv_num(st,& (st->stack->stack_data[st->start+2]));
int skilllv=conv_num(st,& (st->stack->stack_data[st->start+3]));
int x=conv_num(st,& (st->stack->stack_data[st->start+4]));
int y=conv_num(st,& (st->stack->stack_data[st->start+5]));
- clif_skill_poseffect(&nd->bl,skillid,skilllv,x,y,gettick());
+ if (bl)
+ clif_skill_poseffect(bl,skillid,skilllv,x,y,gettick());
return 0;
}