> 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
This commit is contained in:
euphyy 2013-03-27 21:57:45 +00:00
parent ef17b6e927
commit a75c0475a2
9 changed files with 75 additions and 59 deletions

Binary file not shown.

View File

@ -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)) );

View File

@ -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;
}

View File

@ -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);

View File

@ -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);

View File

@ -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) &&

View File

@ -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
};

View File

@ -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);
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
}
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;
script_pushint(st,val);
return 0;
}
/*==========================================

View File

@ -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;