summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzephyrus <zephyrus@54d463be-8e91-2dee-dedb-b68131a5f0ec>2008-05-29 13:07:54 +0000
committerzephyrus <zephyrus@54d463be-8e91-2dee-dedb-b68131a5f0ec>2008-05-29 13:07:54 +0000
commit81b0693fe117080673fb252f297b14e61a550e5d (patch)
tree040aa71774b5b3e51de660bfab57afb03768c7e8
parent2d7d5b8c0f59c6641e4b452492438b3fc9c982fc (diff)
downloadhercules-81b0693fe117080673fb252f297b14e61a550e5d.tar.gz
hercules-81b0693fe117080673fb252f297b14e61a550e5d.tar.bz2
hercules-81b0693fe117080673fb252f297b14e61a550e5d.tar.xz
hercules-81b0693fe117080673fb252f297b14e61a550e5d.zip
- Added support for NPC with different sizes (setnpcdisplay).
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@12744 54d463be-8e91-2dee-dedb-b68131a5f0ec
-rw-r--r--doc/script_commands.txt2
-rw-r--r--src/map/clif.c22
-rw-r--r--src/map/npc.h2
-rw-r--r--src/map/script.c23
4 files changed, 43 insertions, 6 deletions
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index 5f4aa13ab..00c604d01 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -4931,12 +4931,14 @@ complete the effect.
---------------------------------------
+*setnpcdisplay("<npc name>", "<display name>", <class id>, <size>)
*setnpcdisplay("<npc name>", "<display name>", <class id>)
*setnpcdisplay("<npc name>", "<display name>")
*setnpcdisplay("<npc name>", <class id>)
Changes the display name and/or display class of the target npc.
Returns 0 is successful, 1 if the npc does not exist.
+Size is 0 = norma 1 = small 2 = big.
Since trunk r11779
diff --git a/src/map/clif.c b/src/map/clif.c
index fab7605ae..6e302cd17 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -1017,7 +1017,7 @@ int clif_spawn(struct block_list *bl)
else if(sd->state.size==1)
clif_specialeffect(bl,421,AREA);
}
- break;
+ break;
case BL_MOB:
{
TBL_MOB *md = ((TBL_MOB*)bl);
@@ -1026,7 +1026,16 @@ int clif_spawn(struct block_list *bl)
else if(md->special_state.size==1)
clif_specialeffect(&md->bl,421,AREA);
}
- break;
+ break;
+ case BL_NPC:
+ {
+ TBL_NPC *nd = ((TBL_NPC*)bl);
+ if( nd->size == 2 )
+ clif_specialeffect(&nd->bl,423,AREA);
+ else if( nd->size == 1 )
+ clif_specialeffect(&nd->bl,421,AREA);
+ }
+ break;
case BL_PET:
if (vd->head_bottom)
clif_pet_equip_area((TBL_PET*)bl); // needed to display pet equip properly
@@ -3402,6 +3411,10 @@ void clif_getareachar_unit(struct map_session_data* sd,struct block_list *bl)
TBL_NPC* nd = (TBL_NPC*)bl;
if( nd->chat_id )
clif_dispchat((struct chat_data*)map_id2bl(nd->chat_id),sd->fd);
+ if( nd->size == 2 )
+ clif_specialeffect_single(bl,423,sd->fd);
+ else if( nd->size == 1 )
+ clif_specialeffect_single(bl,421,sd->fd);
}
break;
case BL_MOB:
@@ -9200,8 +9213,6 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd)
if (skilllv < 1) skilllv = 1; //No clue, I have seen the client do this with guild skills :/ [Skotlex]
- //Whether skill fails or not is irrelevant, the char ain't idle. [Skotlex]
- sd->idletime = last_tick;
tmp = skill_get_inf(skillnum);
if (tmp&INF_GROUND_SKILL || !tmp)
@@ -9212,6 +9223,9 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd)
return;
}
+ // Whether skill fails or not is irrelevant, the char ain't idle. [Skotlex]
+ sd->idletime = last_tick;
+
if (pc_cant_act(sd))
return;
if (pc_issit(sd))
diff --git a/src/map/npc.h b/src/map/npc.h
index f75ede9c5..984cb3127 100644
--- a/src/map/npc.h
+++ b/src/map/npc.h
@@ -36,6 +36,8 @@ struct npc_data {
int chat_id;
unsigned int next_walktime;
+ unsigned size : 2;
+
void* chatdb; // pointer to a npc_parse struct (see npc_chat.c)
enum npc_subtype subtype;
union {
diff --git a/src/map/script.c b/src/map/script.c
index ce42a0eec..b1885722c 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -11648,6 +11648,7 @@ BUILDIN_FUNC(charisalpha)
/// Changes the display name and/or display class of the npc.
/// Returns 0 is successful, 1 if the npc does not exist.
///
+/// setnpcdisplay("<npc name>", "<new display name>", <new class id>, <new size>) -> <int>
/// setnpcdisplay("<npc name>", "<new display name>", <new class id>) -> <int>
/// setnpcdisplay("<npc name>", "<new display name>") -> <int>
/// setnpcdisplay("<npc name>", <new class id>) -> <int>
@@ -11655,13 +11656,19 @@ BUILDIN_FUNC(setnpcdisplay)
{
const char* name;
const char* newname = NULL;
- int class_ = -1;
+ int class_ = -1, size = -1;
struct script_data* data;
struct npc_data* nd;
name = script_getstr(st,2);
data = script_getdata(st,3);
get_val(st, data);
+ if( script_hasdata(st,5) )
+ {
+ newname = conv_str(st,data);
+ class_ = script_getnum(st,4);
+ size = script_getnum(st,5);
+ }
if( script_hasdata(st,4) )
{
newname = conv_str(st,data);
@@ -11692,8 +11699,20 @@ BUILDIN_FUNC(setnpcdisplay)
// update npc
if( newname )
npc_setdisplayname(nd, newname);
- if( class_ != -1 )
+
+ if( size != -1 && size != nd->size )
+ nd->size = size;
+ else
+ size = -1;
+
+ if( class_ != -1 && nd->class_ == class_ )
npc_setclass(nd, class_);
+ else if( size != -1 )
+ { // Required to update the visual size
+ clif_clearunit_area(&nd->bl, 0);
+ clif_spawn(&nd->bl);
+ }
+
script_pushint(st,0);
return 0;
}