浏览代码

> Hercules merges:
* 9b5ec24:
@accinfo update -- added pincode support and changed group_id to group_level as to respect the level hierarchy on whether to display passwords or not.
Updated GeoIP Database to March 2013.

* 9aded8a:
Introducing Costume Garment Slot 8192.
Also updated getlook script command to support Robe/Garment (val 12 Look_Robe).

* 691b3e6:
Fixed Tetra Vortex client crash. (bugreport:7302)

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@17218 54d463be-8e91-2dee-dedb-b68131a5f0ec

euphyy 12 年之前
父节点
当前提交
a75c0475a2
共有 9 个文件被更改,包括 76 次插入60 次删除
  1. 二进制
      db/GeoIP.dat
  2. 9 4
      src/char/inter.c
  3. 1 1
      src/map/atcommand.c
  4. 3 3
      src/map/intif.c
  5. 1 1
      src/map/intif.h
  6. 15 7
      src/map/pc.c
  7. 24 23
      src/map/pc.h
  8. 21 20
      src/map/script.c
  9. 2 1
      src/map/skill.c

二进制
db/GeoIP.dat


+ 9 - 4
src/char/inter.c

@@ -426,10 +426,10 @@ void mapif_parse_accinfo(int fd) {
 
 	/* it will only get here if we have a single match */
 	if( account_id ) {
-		char userid[NAME_LENGTH], user_pass[NAME_LENGTH], email[40], last_ip[20], lastlogin[30];
+		char userid[NAME_LENGTH], user_pass[NAME_LENGTH], email[40], last_ip[20], lastlogin[30], pincode[5];
 		short level = -1;
 		int logincount = 0,state = 0;
-		if ( SQL_ERROR == Sql_Query(sql_handle, "SELECT `userid`, `user_pass`, `email`, `last_ip`, `group_id`, `lastlogin`, `logincount`, `state` FROM `login` WHERE `account_id` = '%d' LIMIT 1", account_id)
+		if ( SQL_ERROR == Sql_Query(sql_handle, "SELECT `userid`, `user_pass`, `email`, `last_ip`, `group_id`, `lastlogin`, `logincount`, `state`,`pincode` FROM `login` WHERE `account_id` = '%d' LIMIT 1", account_id)
 			|| Sql_NumRows(sql_handle) == 0 ) {
 			if( Sql_NumRows(sql_handle) == 0 ) {
 				inter_to_fd(fd, u_fd, aid,  "No account with ID '%d' was found.", account_id );
@@ -447,6 +447,7 @@ void mapif_parse_accinfo(int fd) {
 			Sql_GetData(sql_handle, 5, &data, NULL); safestrncpy(lastlogin, data, sizeof(lastlogin));
 			Sql_GetData(sql_handle, 6, &data, NULL); logincount = atoi(data);
 			Sql_GetData(sql_handle, 7, &data, NULL); state = atoi(data);
+			Sql_GetData(sql_handle, 8, &data, NULL); safestrncpy(pincode, data, sizeof(pincode));
 		}
 
 		Sql_FreeResult(sql_handle);
@@ -457,8 +458,12 @@ void mapif_parse_accinfo(int fd) {
 		inter_to_fd(fd, u_fd, aid, "-- Account %d --", account_id );
 		inter_to_fd(fd, u_fd, aid, "User: %s | GM Group: %d | State: %d", userid, level, state );
 
-		if (level < castergroup) /* only show pass if your gm level is greater than the one you're searching for */
-			inter_to_fd(fd, u_fd, aid, "Password: %s", user_pass );
+		if (level < castergroup) { /* only show pass if your gm level is greater than the one you're searching for */
+			if( strlen(pincode) )
+				inter_to_fd(fd, u_fd, aid, "Password: %s (PIN:%s)", user_pass, pincode );
+			else
+				inter_to_fd(fd, u_fd, aid, "Password: %s", user_pass );
+		}
 
 		inter_to_fd(fd, u_fd, aid, "Account e-mail: %s", email);
 		inter_to_fd(fd, u_fd, aid, "Last IP: %s (%s)", last_ip, geoip_getcountry(str2ip(last_ip)) );

+ 1 - 1
src/map/atcommand.c

@@ -8554,7 +8554,7 @@ ACMD_FUNC(accinfo) {
 	//remove const type
 	safestrncpy(query, message, NAME_LENGTH);
 
-	intif_request_accinfo( sd->fd, sd->bl.id, sd->group_id, query );
+	intif_request_accinfo( sd->fd, sd->bl.id, pc_get_group_level(sd), query );
 
 	return 0;
 }

+ 3 - 3
src/map/intif.c

@@ -2121,7 +2121,7 @@ int intif_parse_elemental_saved(int fd)
 	return 0;
 }
 
-void intif_request_accinfo( int u_fd, int aid, int group_id, char* query ) {
+void intif_request_accinfo( int u_fd, int aid, int group_lv, char* query ) {
 
 
 	WFIFOHEAD(inter_fd,2 + 4 + 4 + 4 + NAME_LENGTH);
@@ -2129,8 +2129,8 @@ void intif_request_accinfo( int u_fd, int aid, int group_id, char* query ) {
 	WFIFOW(inter_fd,0) = 0x3007;
 	WFIFOL(inter_fd,2) = u_fd;
 	WFIFOL(inter_fd,6) = aid;
-	WFIFOL(inter_fd,10) = group_id;
-    safestrncpy((char *)WFIFOP(inter_fd,14), query, NAME_LENGTH);
+	WFIFOL(inter_fd,10) = group_lv;
+	safestrncpy((char *)WFIFOP(inter_fd,14), query, NAME_LENGTH);
 
 	WFIFOSET(inter_fd,2 + 4 + 4 + 4 + NAME_LENGTH);
 

+ 1 - 1
src/map/intif.h

@@ -105,7 +105,7 @@ int intif_elemental_delete(int ele_id);
 int intif_elemental_save(struct s_elemental *ele);
 
 /* @accinfo */
-void intif_request_accinfo( int u_fd, int aid, int group_id, char* query );
+void intif_request_accinfo( int u_fd, int aid, int group_lv, char* query );
 
 int CheckForCharServer(void);
 

+ 15 - 7
src/map/pc.c

@@ -65,7 +65,7 @@ struct fame_list smith_fame_list[MAX_FAME_LIST];
 struct fame_list chemist_fame_list[MAX_FAME_LIST];
 struct fame_list taekwon_fame_list[MAX_FAME_LIST];
 
-static unsigned short equip_pos[EQI_MAX]={EQP_ACC_L,EQP_ACC_R,EQP_SHOES,EQP_GARMENT,EQP_HEAD_LOW,EQP_HEAD_MID,EQP_HEAD_TOP,EQP_ARMOR,EQP_HAND_L,EQP_HAND_R,EQP_COSTUME_HEAD_TOP,EQP_COSTUME_HEAD_MID,EQP_COSTUME_HEAD_LOW,EQP_AMMO};
+static unsigned short equip_pos[EQI_MAX]={EQP_ACC_L,EQP_ACC_R,EQP_SHOES,EQP_GARMENT,EQP_HEAD_LOW,EQP_HEAD_MID,EQP_HEAD_TOP,EQP_ARMOR,EQP_HAND_L,EQP_HAND_R,EQP_COSTUME_HEAD_TOP,EQP_COSTUME_HEAD_MID,EQP_COSTUME_HEAD_LOW,EQP_COSTUME_GARMENT,EQP_AMMO};
 
 #define MOTD_LINE_SIZE 128
 static char motd_text[MOTD_LINE_SIZE][CHAT_SIZE_MAX]; // Message of the day buffer [Valaris]
@@ -1437,7 +1437,7 @@ int pc_calc_skilltree(struct map_session_data *sd)
 				sd->status.skill[id].id = id;
 				sd->status.skill[id].flag = SKILL_FLAG_TEMPORARY; // So it is not saved, and tagged as a "bonus" skill.
 			}
-			else if( id != NV_BASIC)
+			else if( id != NV_BASIC )
 			{
 				sd->status.skill[id].flag = SKILL_FLAG_REPLACED_LV_0 + sd->status.skill[id].lv; // Remember original level
 			}
@@ -7525,7 +7525,7 @@ int pc_equiplookall(struct map_session_data *sd)
 	clif_changelook(&sd->bl,LOOK_HEAD_BOTTOM,sd->status.head_bottom);
 	clif_changelook(&sd->bl,LOOK_HEAD_TOP,sd->status.head_top);
 	clif_changelook(&sd->bl,LOOK_HEAD_MID,sd->status.head_mid);
-	clif_changelook(&sd->bl, LOOK_ROBE, sd->status.robe);
+	clif_changelook(&sd->bl,LOOK_ROBE, sd->status.robe);
 
 	return 0;
 }
@@ -8570,11 +8570,14 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos)
 	}
 	if(pos & EQP_SHOES)
 		clif_changelook(&sd->bl,LOOK_SHOES,0);
-	if( pos&EQP_GARMENT )
-	{
+	if(pos&EQP_GARMENT) {
 		sd->status.robe = id ? id->look : 0;
 		clif_changelook(&sd->bl, LOOK_ROBE, sd->status.robe);
 	}
+	if(pos & EQP_COSTUME_GARMENT) {
+		sd->status.robe = id ? id->look : 0;
+		clif_changelook(&sd->bl,LOOK_ROBE,sd->status.robe);
+	}
 
 	pc_checkallowskill(sd); //Check if status changes should be halted.
 	iflag = sd->npc_item_flag;
@@ -8710,12 +8713,17 @@ int pc_unequipitem(struct map_session_data *sd,int n,int flag) {
 
 	if(sd->status.inventory[n].equip & EQP_SHOES)
 		clif_changelook(&sd->bl,LOOK_SHOES,0);
-	if( sd->status.inventory[n].equip&EQP_GARMENT )
-	{
+
+	if(sd->status.inventory[n].equip&EQP_GARMENT && pc_checkequip(sd,EQP_COSTUME_GARMENT) == -1) {
 		sd->status.robe = 0;
 		clif_changelook(&sd->bl, LOOK_ROBE, 0);
 	}
 
+	if(sd->status.inventory[n].equip & EQP_COSTUME_GARMENT) {
+		sd->status.robe = ( pc_checkequip(sd,EQP_GARMENT) >= 0 ) ? sd->inventory_data[pc_checkequip(sd,EQP_GARMENT)]->look : 0;
+		clif_changelook(&sd->bl,LOOK_ROBE,sd->status.robe);
+	}
+
 	clif_unequipitemack(sd,n,sd->status.inventory[n].equip,1);
 
 	if((sd->status.inventory[n].equip & EQP_ARMS) &&

+ 24 - 23
src/map/pc.h

@@ -536,28 +536,28 @@ enum ammo_type {
 
 //Equip position constants
 enum equip_pos {
-	EQP_HEAD_LOW = 0x0001,
-	EQP_HEAD_MID = 0x0200, //512
-	EQP_HEAD_TOP = 0x0100, //256
-	EQP_HAND_R   = 0x0002,
-	EQP_HAND_L   = 0x0020, //32
-	EQP_ARMOR    = 0x0010, //16
-	EQP_SHOES    = 0x0040, //64
-	EQP_GARMENT  = 0x0004,
-	EQP_ACC_L    = 0x0008,
-	EQP_ACC_R    = 0x0080, //128
-	EQP_AMMO     = 0x8000, //32768
-	EQP_COSTUME_HEAD_LOW	= 0x1000,
-	EQP_COSTUME_HEAD_MID	= 0x0800,
-	EQP_COSTUME_HEAD_TOP	= 0x0400,
-	//EQP_COSTUME_GARMENT	= 0x2000,
-	//EQP_COSTUME_FLOOR	= 0x4000,
-	//EQP_SHADOW_ARMOR	= 0x10000,//Shadow equip slots will be left disabled until client's supporting them are usable. [Rytech]
-	//EQP_SHADOW_WEAPON	= 0x20000,
-	//EQP_SHADOW_SHIELD	= 0x40000,
-	//EQP_SHADOW_SHOES	= 0x80000,
-	//EQP_SHADOW_ACC_R	= 0x100000,
-	//EQP_SHADOW_ACC_L	= 0x200000,
+	EQP_HEAD_LOW         = 0x0001,
+	EQP_HEAD_MID         = 0x0200, //512
+	EQP_HEAD_TOP         = 0x0100, //256
+	EQP_HAND_R           = 0x0002, //2
+	EQP_HAND_L           = 0x0020, //32
+	EQP_ARMOR            = 0x0010, //16
+	EQP_SHOES            = 0x0040, //64
+	EQP_GARMENT          = 0x0004, //4
+	EQP_ACC_L            = 0x0008, //8
+	EQP_ACC_R            = 0x0080, //128
+	EQP_COSTUME_HEAD_TOP = 0x0400, //1024
+	EQP_COSTUME_HEAD_MID = 0x0800, //2048
+	EQP_COSTUME_HEAD_LOW = 0x1000, //4096
+	EQP_COSTUME_GARMENT  = 0x2000, //8192
+	EQP_AMMO             = 0x8000, //32768
+	//EQP_COSTUME_FLOOR  = 0x4000,
+	//EQP_SHADOW_ARMOR   = 0x10000,//Shadow equip slots will be left disabled until client's supporting them are usable. [Rytech]
+	//EQP_SHADOW_WEAPON  = 0x20000,
+	//EQP_SHADOW_SHIELD  = 0x40000,
+	//EQP_SHADOW_SHOES   = 0x80000,
+	//EQP_SHADOW_ACC_R   = 0x100000,
+	//EQP_SHADOW_ACC_L   = 0x200000,
 };
 
 #define EQP_WEAPON EQP_HAND_R
@@ -565,7 +565,7 @@ enum equip_pos {
 #define EQP_ARMS (EQP_HAND_R|EQP_HAND_L)
 #define EQP_HELM (EQP_HEAD_LOW|EQP_HEAD_MID|EQP_HEAD_TOP)
 #define EQP_ACC (EQP_ACC_L|EQP_ACC_R)
-#define EQP_COSTUME (EQP_COSTUME_HEAD_TOP|EQP_COSTUME_HEAD_MID|EQP_COSTUME_HEAD_LOW)
+#define EQP_COSTUME (EQP_COSTUME_HEAD_TOP|EQP_COSTUME_HEAD_MID|EQP_COSTUME_HEAD_LOW|EQP_COSTUME_GARMENT)
 //#define EQP_SHADOW_GEAR (EQP_SHADOW_ARMOR|EQP_SHADOW_WEAPON|EQP_SHADOW_SHIELD|EQP_SHADOW_SHOES|EQP_SHADOW_ACC_R|EQP_SHADOW_ACC_L)
 
 /// Equip positions that use a visible sprite
@@ -591,6 +591,7 @@ enum equip_index {
 	EQI_COSTUME_TOP,
 	EQI_COSTUME_MID,
 	EQI_COSTUME_LOW,
+	EQI_COSTUME_GARMENT,
 	EQI_AMMO,
 	EQI_MAX
 };

+ 21 - 20
src/map/script.c

@@ -7346,7 +7346,7 @@ BUILDIN_FUNC(strnpcinfo)
 
 
 // aegis->athena slot position conversion table
-static unsigned int equip[] = {EQP_HEAD_TOP,EQP_ARMOR,EQP_HAND_L,EQP_HAND_R,EQP_GARMENT,EQP_SHOES,EQP_ACC_L,EQP_ACC_R,EQP_HEAD_MID,EQP_HEAD_LOW,EQP_COSTUME_HEAD_LOW,EQP_COSTUME_HEAD_MID,EQP_COSTUME_HEAD_TOP};
+static unsigned int equip[] = {EQP_HEAD_TOP,EQP_ARMOR,EQP_HAND_L,EQP_HAND_R,EQP_GARMENT,EQP_SHOES,EQP_ACC_L,EQP_ACC_R,EQP_HEAD_MID,EQP_HEAD_LOW,EQP_COSTUME_HEAD_LOW,EQP_COSTUME_HEAD_MID,EQP_COSTUME_HEAD_TOP,EQP_COSTUME_GARMENT};
 
 /*==========================================
  * GetEquipID(Pos);     Pos: 1-13
@@ -12958,26 +12958,27 @@ BUILDIN_FUNC(npcstop)
  *------------------------------------------*/
 BUILDIN_FUNC(getlook)
 {
-        int type,val;
-        TBL_PC *sd;
-        sd=script_rid2sd(st);
-
-        type=script_getnum(st,2);
-        val=-1;
-        switch(type) {
-        case LOOK_HAIR: val=sd->status.hair; break; //1
-        case LOOK_WEAPON: val=sd->status.weapon; break; //2
-        case LOOK_HEAD_BOTTOM: val=sd->status.head_bottom; break; //3
-        case LOOK_HEAD_TOP: val=sd->status.head_top; break; //4
-        case LOOK_HEAD_MID: val=sd->status.head_mid; break; //5
-        case LOOK_HAIR_COLOR: val=sd->status.hair_color; break; //6
-        case LOOK_CLOTHES_COLOR: val=sd->status.clothes_color; break; //7
-        case LOOK_SHIELD: val=sd->status.shield; break; //8
-        case LOOK_SHOES: break; //9
-        }
+	int type,val;
+	TBL_PC *sd;
+	sd=script_rid2sd(st);
 
-        script_pushint(st,val);
-        return 0;
+	type=script_getnum(st,2);
+	val=-1;
+	switch(type) {
+		case LOOK_HAIR:     	val=sd->status.hair; break; //1
+		case LOOK_WEAPON:   	val=sd->status.weapon; break; //2
+		case LOOK_HEAD_BOTTOM:	val=sd->status.head_bottom; break; //3
+		case LOOK_HEAD_TOP: 	val=sd->status.head_top; break; //4
+		case LOOK_HEAD_MID: 	val=sd->status.head_mid; break; //5
+		case LOOK_HAIR_COLOR:	val=sd->status.hair_color; break; //6
+		case LOOK_CLOTHES_COLOR:	val=sd->status.clothes_color; break; //7
+		case LOOK_SHIELD:   	val=sd->status.shield; break; //8
+		case LOOK_SHOES:    	break; //9
+		case LOOK_ROBE:     	val=sd->status.robe; break; //12
+	}
+
+	script_pushint(st,val);
+	return 0;
 }
 
 /*==========================================

+ 2 - 1
src/map/skill.c

@@ -4391,7 +4391,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 				else // Last spell to be released
 					status_change_end(src, SC_READING_SB, INVALID_TIMER);
 
-				clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
+				if( bl->type != BL_SKILL ) /* skill types will crash the client */
+					clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
 				if( !skill_check_condition_castbegin(sd, skill_id, skill_lv) )
 					break;