- Moved define CHAT_SIZE to clif.c, added define CHATBOX_SIZE to specify that 70 char limit of the input area.

- Fixed #lvup having the gm level check backwards.
- Fixed the stormgust freeze counter going up even if the attack is blocked/cancelled.
- Updated mes_len_check to receive max expected size as well (clif.c)
- Cleaned up parsing functions for /mm, /resetskill, /resetstate, /item, /monster, /hide
- 


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9811 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
skotlex 2007-02-06 21:49:00 +00:00
parent 4b7dcab0f2
commit c1d503fdcb
6 changed files with 100 additions and 93 deletions

View File

@ -4,6 +4,9 @@ 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. IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2007/02/06 2007/02/06
* Fixed #lvup having the gm level check backwards.
* Fixed the stormgust freeze counter going up even if the attack is
blocked/cancelled.
* Cleaned up homunc attack request parsing. Homunculus no longer goes into * Cleaned up homunc attack request parsing. Homunculus no longer goes into
auto-attack (ctrl+click) mode since the client does every attack request auto-attack (ctrl+click) mode since the client does every attack request
individually. individually.

View File

@ -1030,15 +1030,15 @@ int atcommand_config_read(const char *cfgName)
*/ */
int atcommand_commands(const int fd, struct map_session_data* sd, const char* command, const char* message) int atcommand_commands(const int fd, struct map_session_data* sd, const char* command, const char* message)
{ {
char cz_line_buff[CHAT_SIZE+1]; char cz_line_buff[CHATBOX_SIZE+1];
register char *lpcz_cur = cz_line_buff; register char *lpcz_cur = cz_line_buff;
register unsigned int ui_slen; register unsigned int ui_slen;
int i_cur_cmd,gm_lvl = pc_isGM(sd), count = 0; int i_cur_cmd,gm_lvl = pc_isGM(sd), count = 0;
memset(cz_line_buff,' ',CHAT_SIZE); memset(cz_line_buff,' ',CHATBOX_SIZE);
cz_line_buff[CHAT_SIZE] = 0; cz_line_buff[CHATBOX_SIZE] = 0;
clif_displaymessage(fd, msg_txt(273)); clif_displaymessage(fd, msg_txt(273));
@ -1051,12 +1051,12 @@ int atcommand_commands(const int fd, struct map_session_data* sd, const char* co
ui_slen = (unsigned int)strlen(atcommand_info[i_cur_cmd].command); ui_slen = (unsigned int)strlen(atcommand_info[i_cur_cmd].command);
//remember not <= bc we need null terminator //remember not <= bc we need null terminator
if(((CHAT_SIZE+(int)cz_line_buff)-(int)lpcz_cur) < (int)ui_slen) if(((CHATBOX_SIZE+(int)cz_line_buff)-(int)lpcz_cur) < (int)ui_slen)
{ {
clif_displaymessage(fd,(char*)cz_line_buff); clif_displaymessage(fd,(char*)cz_line_buff);
lpcz_cur = cz_line_buff; lpcz_cur = cz_line_buff;
memset(cz_line_buff,' ',CHAT_SIZE); memset(cz_line_buff,' ',CHATBOX_SIZE);
cz_line_buff[CHAT_SIZE] = 0; cz_line_buff[CHATBOX_SIZE] = 0;
} }
memcpy(lpcz_cur,atcommand_info[i_cur_cmd].command,ui_slen); memcpy(lpcz_cur,atcommand_info[i_cur_cmd].command,ui_slen);

View File

@ -1302,7 +1302,7 @@ int charcommand_baselevel(
clif_displaymessage(fd, msg_table[3]); // Character not found. clif_displaymessage(fd, msg_table[3]); // Character not found.
return -1; return -1;
} }
if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change base level only lower or same gm level if (pc_isGM(sd) < pc_isGM(pl_sd)) { // you can change base level only lower or same gm level
clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
return -1; return -1;
} }

View File

@ -4,6 +4,9 @@
#define DUMP_UNKNOWN_PACKET 0 #define DUMP_UNKNOWN_PACKET 0
#define DUMP_ALL_PACKETS 0 #define DUMP_ALL_PACKETS 0
//Talk max size: <name> : <message of 70> [Skotlex]
#define CHAT_SIZE (NAME_LENGTH + 3 + CHATBOX_SIZE)
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
#include <stdlib.h> #include <stdlib.h>
@ -94,7 +97,7 @@ struct packet_db packet_db[MAX_PACKET_VER + 1][MAX_PACKET_DB];
#define disguised(bl) (bl->type==BL_PC && ((TBL_PC*)bl)->disguise) #define disguised(bl) (bl->type==BL_PC && ((TBL_PC*)bl)->disguise)
//Guarantees that the given string does not exceeds the allowed size, as well as making sure it's null terminated. [Skotlex\] //Guarantees that the given string does not exceeds the allowed size, as well as making sure it's null terminated. [Skotlex\]
#define mes_len_check(mes, len) if (len > CHAT_SIZE) { mes[CHAT_SIZE-1] = '\0'; len = CHAT_SIZE; } else mes[len-1] = '\0'; #define mes_len_check(mes, len, max) if (len > max) { mes[max-1] = '\0'; len = max; } else mes[len-1] = '\0';
static char map_ip_str[128]; static char map_ip_str[128];
static in_addr_t map_ip; static in_addr_t map_ip;
static in_addr_t bind_ip = INADDR_ANY; static in_addr_t bind_ip = INADDR_ANY;
@ -8665,23 +8668,25 @@ int clif_message(struct block_list *bl, char* msg)
*/ */
void clif_parse_MapMove(int fd, struct map_session_data *sd) { void clif_parse_MapMove(int fd, struct map_session_data *sd) {
// /m /mapmove (as @rura GM command) // /m /mapmove (as @rura GM command)
char output[30]; // 17+4+4=26, 30 max. char output[MAP_NAME_LENGTH+15]; // Max length of a short: ' -6XXXX' -> 7 digits
char message[34]; // "/mm "+output char message[MAP_NAME_LENGTH+15+5]; // "/mm "+output
char map_name[MAP_NAME_LENGTH]; //Err... map names are 15+'\0' in size, not 16+'\0' [Skotlex] char *map_name;
RFIFOHEAD(fd); RFIFOHEAD(fd);
if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) && if (battle_config.atc_gmonly && !pc_isGM(sd))
(pc_isGM(sd) >= get_atcommand_level(AtCommand_MapMove))) { return;
memcpy(map_name, RFIFOP(fd,2), MAP_NAME_LENGTH-1); if(pc_isGM(sd) < get_atcommand_level(AtCommand_MapMove))
return;
map_name = RFIFOP(fd,2);
map_name[MAP_NAME_LENGTH-1]='\0'; map_name[MAP_NAME_LENGTH-1]='\0';
sprintf(output, "%s %d %d", map_name, RFIFOW(fd,18), RFIFOW(fd,20)); sprintf(output, "%s %d %d", map_name, RFIFOW(fd,18), RFIFOW(fd,20));
atcommand_rura(fd, sd, "@rura", output); atcommand_rura(fd, sd, "@rura", output);
if((log_config.gm) && (get_atcommand_level(AtCommand_MapMove) >= log_config.gm)) { if(log_config.gm && get_atcommand_level(AtCommand_MapMove) >= log_config.gm)
{
sprintf(message, "/mm %s", output); sprintf(message, "/mm %s", output);
log_atcommand(sd, message); log_atcommand(sd, message);
} }
}
return; return;
} }
@ -8950,7 +8955,8 @@ void clif_parse_Wis(int fd, struct map_session_data *sd) { // S 0096 <len>.w <ni
msg = command; msg = command;
msg+= sprintf(command, "%s : ", sd->status.name); msg+= sprintf(command, "%s : ", sd->status.name);
memcpy(msg, RFIFOP(fd, 28), len); memcpy(msg, RFIFOP(fd, 28), len);
mes_len_check(msg, len); mes_len_check(msg, len, CHATBOX_SIZE);
if ((is_charcommand(fd, sd, command) != CharCommand_None) || if ((is_charcommand(fd, sd, command) != CharCommand_None) ||
(is_atcommand(fd, sd, command) != AtCommand_None)) { (is_atcommand(fd, sd, command) != AtCommand_None)) {
aFree(command); aFree(command);
@ -9118,7 +9124,7 @@ void clif_parse_GMmessage(int fd, struct map_session_data *sd) {
size = WFIFOW(fd,2)-4; size = WFIFOW(fd,2)-4;
mes = RFIFOP(fd,4); mes = RFIFOP(fd,4);
mes_len_check(mes, size); mes_len_check(mes, size, CHAT_SIZE);
intif_GMmessage(mes, size, 0); intif_GMmessage(mes, size, 0);
if(log_config.gm && lv >= log_config.gm) { if(log_config.gm && lv >= log_config.gm) {
@ -10097,21 +10103,19 @@ void clif_parse_SolveCharName(int fd, struct map_session_data *sd) {
*/ */
void clif_parse_ResetChar(int fd, struct map_session_data *sd) { void clif_parse_ResetChar(int fd, struct map_session_data *sd) {
RFIFOHEAD(fd); RFIFOHEAD(fd);
if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) && if (battle_config.atc_gmonly && !pc_isGM(sd))
pc_isGM(sd) >= get_atcommand_level(AtCommand_ResetState)) { return;
switch(RFIFOW(fd,2)){ if (pc_isGM(sd) < get_atcommand_level(AtCommand_ResetState))
case 0: return;
pc_resetstate(sd);
break; if (RFIFOW(fd,2))
case 1:
pc_resetskill(sd,1); pc_resetskill(sd,1);
break; else
} pc_resetstate(sd);
if((log_config.gm) && (get_atcommand_level(AtCommand_ResetState) >= log_config.gm)) {
if(log_config.gm && get_atcommand_level(AtCommand_ResetState >= log_config.gm))
log_atcommand(sd, RFIFOW(fd,2) ? "/resetskill" : "/resetstate"); log_atcommand(sd, RFIFOW(fd,2) ? "/resetskill" : "/resetstate");
} }
}
}
/*========================================== /*==========================================
* 019c /lb等 * 019c /lb等
@ -10130,7 +10134,7 @@ void clif_parse_LGMmessage(int fd, struct map_session_data *sd) {
len = RFIFOW(fd,2) - 4; len = RFIFOW(fd,2) - 4;
mes = RFIFOP(fd,4); mes = RFIFOP(fd,4);
mes_len_check(mes, len); mes_len_check(mes, len, CHAT_SIZE);
WBUFW(buf,0) = 0x9a; WBUFW(buf,0) = 0x9a;
WBUFW(buf,2) = len+4; WBUFW(buf,2) = len+4;
@ -10364,7 +10368,7 @@ void clif_parse_PartyMessage(int fd, struct map_session_data *sd) {
RFIFOHEAD(fd); RFIFOHEAD(fd);
len = RFIFOW(fd,2) - 4; len = RFIFOW(fd,2) - 4;
mes = RFIFOP(fd,4); mes = RFIFOP(fd,4);
mes_len_check(mes, len); mes_len_check(mes, len, CHAT_SIZE);
if (is_charcommand(fd, sd, mes) != CharCommand_None || if (is_charcommand(fd, sd, mes) != CharCommand_None ||
is_atcommand(fd, sd, mes) != AtCommand_None) is_atcommand(fd, sd, mes) != AtCommand_None)
@ -10641,7 +10645,7 @@ void clif_parse_GuildMessage(int fd,struct map_session_data *sd) {
RFIFOHEAD(fd); RFIFOHEAD(fd);
len = RFIFOW(fd,2) - 4; len = RFIFOW(fd,2) - 4;
mes = RFIFOP(fd,4); mes = RFIFOP(fd,4);
mes_len_check(mes, len); mes_len_check(mes, len, CHAT_SIZE);
if (is_charcommand(fd, sd, mes) != CharCommand_None || if (is_charcommand(fd, sd, mes) != CharCommand_None ||
is_atcommand(fd, sd, mes) != AtCommand_None) is_atcommand(fd, sd, mes) != AtCommand_None)
@ -10894,46 +10898,50 @@ void clif_parse_Recall(int fd, struct map_session_data *sd) { // Added by RoVeRT
} }
/*========================================== /*==========================================
* /monster /item rewriten by [Yor] * /monster /item
*------------------------------------------ *------------------------------------------
*/ */
void clif_parse_GM_Monster_Item(int fd, struct map_session_data *sd) { void clif_parse_GM_Monster_Item(int fd, struct map_session_data *sd) {
char monster_item_name[NAME_LENGTH+10]; //Additional space is for logging, eg: "@monster Poring" char *monster_item_name;
char message[NAME_LENGTH+10]; //For logging.
int level; int level;
memset(monster_item_name, '\0', sizeof(monster_item_name));
if (battle_config.atc_gmonly == 0 || pc_isGM(sd)) {
RFIFOHEAD(fd); RFIFOHEAD(fd);
memcpy(monster_item_name, RFIFOP(fd,2), NAME_LENGTH);
if (mobdb_searchname(monster_item_name) != 0) { if (battle_config.atc_gmonly && !pc_isGM(sd))
if (pc_isGM(sd) >= (level =get_atcommand_level(AtCommand_Spawn))) // changed from AtCommand_Monster for Skots [Reddozen] return;
{
monster_item_name = RFIFOP(fd,2);
monster_item_name[NAME_LENGTH-1] = '\0';
if (mobdb_searchname(monster_item_name)) {
if (pc_isGM(sd) < (level=get_atcommand_level(AtCommand_Spawn)))
return;
atcommand_monster(fd, sd, "@spawn", monster_item_name); // as @spawn atcommand_monster(fd, sd, "@spawn", monster_item_name); // as @spawn
if(log_config.gm && level >= log_config.gm) if(log_config.gm && level >= log_config.gm)
{ //Log action. [Skotlex] { //Log action. [Skotlex]
snprintf(monster_item_name, sizeof(monster_item_name)-1, "@spawn %s", RFIFOP(fd,2)); snprintf(message, sizeof(message)-1, "@spawn %s", monster_item_name);
log_atcommand(sd, monster_item_name); log_atcommand(sd, message);
} }
return;
} }
} else if (itemdb_searchname(monster_item_name) != NULL) { if (itemdb_searchname(monster_item_name) == NULL)
if (pc_isGM(sd) >= (level = get_atcommand_level(AtCommand_Item))) return;
{ if (pc_isGM(sd) < (level = get_atcommand_level(AtCommand_Item)))
return;
atcommand_item(fd, sd, "@item", monster_item_name); // as @item atcommand_item(fd, sd, "@item", monster_item_name); // as @item
if(log_config.gm && level >= log_config.gm) if(log_config.gm && level >= log_config.gm)
{ //Log action. [Skotlex] { //Log action. [Skotlex]
snprintf(monster_item_name, sizeof(monster_item_name)-1, "@item %s", RFIFOP(fd,2)); sprintf(message, "@item %s", monster_item_name);
log_atcommand(sd, monster_item_name); log_atcommand(sd, message);
}
}
}
} }
} }
void clif_parse_GMHide(int fd, struct map_session_data *sd) { // Modified by [Yor] void clif_parse_GMHide(int fd, struct map_session_data *sd) { // Modified by [Yor]
if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) && if (battle_config.atc_gmonly && !pc_isGM(sd))
(pc_isGM(sd) >= get_atcommand_level(AtCommand_Hide))) { return;
if (pc_isGM(sd) < get_atcommand_level(AtCommand_Hide))
return;
if (sd->sc.option & OPTION_INVISIBLE) { if (sd->sc.option & OPTION_INVISIBLE) {
sd->sc.option &= ~OPTION_INVISIBLE; sd->sc.option &= ~OPTION_INVISIBLE;
if (sd->disguise) if (sd->disguise)
@ -10943,16 +10951,13 @@ void clif_parse_GMHide(int fd, struct map_session_data *sd) { // Modified by [Yo
clif_displaymessage(fd, "Invisible: Off."); clif_displaymessage(fd, "Invisible: Off.");
} else { } else {
sd->sc.option |= OPTION_INVISIBLE; sd->sc.option |= OPTION_INVISIBLE;
//Experimental hidden mode, changes your view class to invisible [Skotlex]
sd->vd.class_ = INVISIBLE_CLASS; sd->vd.class_ = INVISIBLE_CLASS;
clif_displaymessage(fd, "Invisible: On."); clif_displaymessage(fd, "Invisible: On.");
if((log_config.gm) && (get_atcommand_level(AtCommand_Hide) >= log_config.gm)) { if(log_config.gm && get_atcommand_level(AtCommand_Hide) >= log_config.gm)
log_atcommand(sd, "/hide"); log_atcommand(sd, "/hide");
} }
}
clif_changeoption(&sd->bl); clif_changeoption(&sd->bl);
} }
}
/*========================================== /*==========================================
* GMによるチャット禁止時間付与 * GMによるチャット禁止時間付与

View File

@ -159,11 +159,11 @@ enum {
MAPID_BABY_SOUL_LINKER, MAPID_BABY_SOUL_LINKER,
}; };
//Talk max size: <name> : <message of 70> [Skotlex]
#define CHAT_SIZE (NAME_LENGTH + 3 + 70)
//Max size when inputting a string with those 'npc input boxes' //Max size when inputting a string with those 'npc input boxes'
//(also used for Graffiti, Talkie Box, Vending, and Chatrooms) //(also used for Graffiti, Talkie Box, Vending, and Chatrooms)
#define MESSAGE_SIZE 80 #define MESSAGE_SIZE 80
//String length you can write in the 'talking box'
#define CHATBOX_SIZE 70
#define DEFAULT_AUTOSAVE_INTERVAL 5*60*1000 #define DEFAULT_AUTOSAVE_INTERVAL 5*60*1000

View File

@ -7130,11 +7130,9 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
skill_attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); skill_attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
break; break;
case WZ_STORMGUST: case WZ_STORMGUST:
if (tsc) if (skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0) > 0
{ //This should be safe as skill_additional_effect && tsc)
//won't be triggered if the attack is absorbed. [Skotlex] { //Increase freeze counter if attack connects.
//And if the target is already frozen,
//the counter is reset when it ends.
if (tsc->data[SC_FREEZE].val4 == sg->group_id) if (tsc->data[SC_FREEZE].val4 == sg->group_id)
tsc->data[SC_FREEZE].val3++; //SG hit counter. tsc->data[SC_FREEZE].val3++; //SG hit counter.
else { //New SG else { //New SG
@ -7142,6 +7140,7 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
tsc->data[SC_FREEZE].val3 = 1; tsc->data[SC_FREEZE].val3 = 1;
} }
} }
break;
default: default:
skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
} }