From d6c35b853a58c9c9da541be939b75d3f0f1deebd Mon Sep 17 00:00:00 2001
From: eathenabot <eathenabot@54d463be-8e91-2dee-dedb-b68131a5f0ec>
Date: Tue, 17 Jan 2012 06:56:42 +0000
Subject: [PATCH] * Merged changes up to eAthena 15063.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@15478 54d463be-8e91-2dee-dedb-b68131a5f0ec
---
 db/packet_db.txt |   2 +-
 src/map/clif.c   | 149 +++++++++++++++++++++++++++++++++++++++++++++++
 src/map/clif.h   |   6 ++
 3 files changed, 156 insertions(+), 1 deletion(-)

diff --git a/db/packet_db.txt b/db/packet_db.txt
index f59c86013d..9da4dc4e34 100644
--- a/db/packet_db.txt
+++ b/db/packet_db.txt
@@ -735,7 +735,7 @@ packet_ver: 16
 0x022f,5
 0x0231,26,changehomunculusname,0
 0x023a,4
-0x023b,24,storagepassword,0
+0x023b,36,storagepassword,2:4:20
 0x023c,6
 
 //2005-06-22aSakexe
diff --git a/src/map/clif.c b/src/map/clif.c
index 2676499fed..ecd4819da1 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -658,6 +658,24 @@ void clif_authok(struct map_session_data *sd)
 	WFIFOSET(fd,packet_len(cmd));
 }
 
+
+/// Notifies the client, that it's connection attempt was refused (ZC_REFUSE_ENTER).
+/// 0074 <error code>.B
+/// error code:
+///     0 = client type mismatch
+///     1 = ID mismatch
+///     2 = mobile - out of available time
+///     3 = mobile - already logged in
+///     4 = mobile - waiting state
+void clif_authrefuse(int fd, uint8 error_code)
+{
+	WFIFOHEAD(fd,packet_len(0x74));
+	WFIFOW(fd,0) = 0x74;
+	WFIFOB(fd,2) = error_code;
+	WFIFOSET(fd,packet_len(0x74));
+}
+
+
 /*==========================================
  * Authentication failed/disconnect client.
  *------------------------------------------
@@ -3644,6 +3662,21 @@ void clif_tradecompleted(struct map_session_data* sd, int fail)
 	WFIFOSET(fd,packet_len(0xf0));
 }
 
+
+/// Resets the trade window on the send side (ZC_EXCHANGEITEM_UNDO).
+/// 00f1
+/// NOTE: Unknown purpose. Items are not removed until the window is
+///       refreshed (ex. by putting another item in there).
+void clif_tradeundo(struct map_session_data* sd)
+{
+	int fd = sd->fd;
+
+	WFIFOHEAD(fd,packet_len(0xf1));
+	WFIFOW(fd,0) = 0xf1;
+	WFIFOSET(fd,packet_len(0xf1));
+}
+
+
 /*==========================================
  * Server tells client it's quantity of items in storage changed
  *------------------------------------------*/
@@ -6588,6 +6621,22 @@ void clif_mvp_exp(struct map_session_data *sd, unsigned int exp)
 	WFIFOSET(fd,packet_len(0x10b));
 }
 
+
+/// Dropped MVP item reward message (ZC_THROW_MVPITEM).
+/// 010d
+///
+/// "You are the MVP, but cannot obtain the reward because
+///     you are overweight."
+void clif_mvp_noitem(struct map_session_data* sd)
+{
+	int fd = sd->fd;
+
+	WFIFOHEAD(fd,packet_len(0x10d));
+	WFIFOW(fd,0) = 0x10d;
+	WFIFOSET(fd,packet_len(0x10d));
+}
+
+
 /*==========================================
  * Guild creation result
  * R 0167 <flag>.B
@@ -7606,6 +7655,32 @@ void clif_specialeffect_single(struct block_list* bl, int type, int fd)
 	WFIFOSET(fd,10);
 }
 
+
+/// Notifies clients of an special/visual effect that accepts an value (ZC_NOTIFY_EFFECT3).
+/// 0284 <id>.L <effect id>.L <num data>.L
+/// effect id:
+///     @see doc/effect_list.txt
+/// num data:
+///     effect-dependent value
+void clif_specialeffect_value(struct block_list* bl, int effect_id, int num, send_target target)
+{
+	uint8 buf[14];
+
+	WBUFW(buf,0) = 0x284;
+	WBUFL(buf,2) = bl->id;
+	WBUFL(buf,6) = effect_id;
+	WBUFL(buf,10) = num;
+
+	clif_send(buf, packet_len(0x284), bl, target);
+
+	if( disguised(bl) )
+	{
+		WBUFL(buf,2) = -bl->id;
+		clif_send(buf, packet_len(0x284), bl, SELF);
+	}
+}
+
+
 /******************************************************
  * W.<packet> W.<LENGTH> L.<ID> L.<COLOR> S.<TEXT>
  * Mob/NPC Color Talk [SnakeDrak]
@@ -8190,6 +8265,38 @@ void clif_msg(struct map_session_data* sd, unsigned short id)
 	WFIFOSET(fd, packet_len(0x291));
 }
 
+
+/// Display msgstringtable.txt string and fill in a valid for %d format (ZC_MSG_VALUE).
+/// 0x7e2 <message>.W <value>.L
+void clif_msg_value(struct map_session_data* sd, unsigned short id, int value)
+{
+	int fd = sd->fd;
+
+	WFIFOHEAD(fd, packet_len(0x7e2));
+	WFIFOW(fd,0) = 0x7e2;
+	WFIFOW(fd,2) = id;
+	WFIFOL(fd,4) = value;
+	WFIFOSET(fd, packet_len(0x7e2));
+}
+
+
+/// Displays msgstringtable.txt string, prefixed with a skill name. (ZC_MSG_SKILL).
+/// 07e6 <skill id>.W <msg id>.L
+///
+/// NOTE: Message has following format and is printed in color 0xCDCDFF (purple):
+///       "[SkillName] Message"
+void clif_msg_skill(struct map_session_data* sd, unsigned short skill_id, int msg_id)
+{
+	int fd = sd->fd;
+
+	WFIFOHEAD(fd, packet_len(0x7e6));
+	WFIFOW(fd,0) = 0x7e6;
+	WFIFOW(fd,2) = skill_id;
+	WFIFOL(fd,4) = msg_id;
+	WFIFOSET(fd, packet_len(0x7e6));
+}
+
+
 /// View player equip request denied
 void clif_viewequip_fail(struct map_session_data* sd)
 {
@@ -10586,6 +10693,26 @@ void clif_parse_CloseKafra(int fd, struct map_session_data *sd)
 		storage_guild_storageclose(sd);
 }
 
+
+/// Displays kafra storage password dialog (ZC_REQ_STORE_PASSWORD).
+/// 023a <info>.W
+/// info:
+///     0 = password has not been set yet
+///     1 = storage is password-protected
+///     8 = too many wrong passwords
+///     ? = ignored
+/// NOTE: This packet is only available on certain non-kRO clients.
+void clif_storagepassword(struct map_session_data* sd, short info)
+{
+	int fd = sd->fd;
+
+	WFIFOHEAD(fd,packet_len(0x23a));
+	WFIFOW(fd,0) = 0x23a;
+	WFIFOW(fd,2) = info;
+	WFIFOSET(fd,packet_len(0x23a));
+}
+
+
 /*==========================================
  * Kafra storage protection password system
  *------------------------------------------*/
@@ -10595,6 +10722,28 @@ void clif_parse_StoragePassword(int fd, struct map_session_data *sd)
 }
 
 
+/// Result of kafra storage password validation (ZC_RESULT_STORE_PASSWORD).
+/// 023c <result>.W <error count>.W
+/// result:
+///     4 = password change success
+///     5 = password change failure
+///     6 = password check success
+///     7 = password check failure
+///     8 = too many wrong passwords
+///     ? = ignored
+/// NOTE: This packet is only available on certain non-kRO clients.
+void clif_storagepassword_result(struct map_session_data* sd, short result, short error_count)
+{
+	int fd = sd->fd;
+
+	WFIFOHEAD(fd,packet_len(0x23c));
+	WFIFOW(fd,0) = 0x23c;
+	WFIFOW(fd,2) = result;
+	WFIFOW(fd,4) = error_count;
+	WFIFOSET(fd,packet_len(0x23c));
+}
+
+
 /*==========================================
  * Party creation request
  * S 00f9 <party name>.24S
diff --git a/src/map/clif.h b/src/map/clif.h
index 4162905be8..efe85cefc4 100644
--- a/src/map/clif.h
+++ b/src/map/clif.h
@@ -309,6 +309,7 @@ uint32 clif_refresh_ip(void);
 uint16 clif_getport(void);
 
 void clif_authok(struct map_session_data *sd);
+void clif_authrefuse(int fd, uint8 error_code);
 void clif_authfail_fd(int fd, int type);
 void clif_charselectok(int id, uint8 ok);
 void clif_dropflooritem(struct flooritem_data* fitem);
@@ -394,6 +395,7 @@ void clif_tradeitemok(struct map_session_data* sd, int index, int fail);
 void clif_tradedeal_lock(struct map_session_data* sd, int fail);
 void clif_tradecancelled(struct map_session_data* sd);
 void clif_tradecompleted(struct map_session_data* sd, int fail);
+void clif_tradeundo(struct map_session_data* sd);
 
 // storage
 void clif_storagelist(struct map_session_data* sd, struct item* items, int items_length);
@@ -475,6 +477,7 @@ void clif_item_skill(struct map_session_data *sd,int skillid,int skilllv);
 void clif_mvp_effect(struct map_session_data *sd);
 void clif_mvp_item(struct map_session_data *sd,int nameid);
 void clif_mvp_exp(struct map_session_data *sd, unsigned int exp);
+void clif_mvp_noitem(struct map_session_data* sd);
 void clif_changed_dir(struct block_list *bl, enum send_target target);
 
 // vending
@@ -589,6 +592,7 @@ void clif_specialeffect(struct block_list* bl, int type, enum send_target target
 void clif_specialeffect_single(struct block_list* bl, int type, int fd);
 void clif_messagecolor(struct block_list* bl, unsigned long color, const char* msg); // Mob/Npc color talk [SnakeDrak]
 void clif_message(struct block_list* bl, const char* msg); // messages (from mobs/npcs) [Valaris]
+void clif_specialeffect_value(struct block_list* bl, int effect_id, int num, send_target target);
 
 void clif_GM_kickack(struct map_session_data *sd, int id);
 void clif_GM_kick(struct map_session_data *sd,struct map_session_data *tsd);
@@ -621,6 +625,8 @@ void clif_viewequip_fail(struct map_session_data* sd);
 void clif_equipcheckbox(struct map_session_data* sd);
 
 void clif_msg(struct map_session_data* sd, unsigned short id);
+void clif_msg_value(struct map_session_data* sd, unsigned short id, int value);
+void clif_msg_skill(struct map_session_data* sd, unsigned short skill_id, int msg_id);
 
 //quest system [Kevin] [Inkfish]
 void clif_quest_send_list(struct map_session_data * sd);