- 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.
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
auto-attack (ctrl+click) mode since the client does every attack request
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)
{
char cz_line_buff[CHAT_SIZE+1];
char cz_line_buff[CHATBOX_SIZE+1];
register char *lpcz_cur = cz_line_buff;
register unsigned int ui_slen;
int i_cur_cmd,gm_lvl = pc_isGM(sd), count = 0;
memset(cz_line_buff,' ',CHAT_SIZE);
cz_line_buff[CHAT_SIZE] = 0;
memset(cz_line_buff,' ',CHATBOX_SIZE);
cz_line_buff[CHATBOX_SIZE] = 0;
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);
//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);
lpcz_cur = cz_line_buff;
memset(cz_line_buff,' ',CHAT_SIZE);
cz_line_buff[CHAT_SIZE] = 0;
memset(cz_line_buff,' ',CHATBOX_SIZE);
cz_line_buff[CHATBOX_SIZE] = 0;
}
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.
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.
return -1;
}

View File

@ -4,6 +4,9 @@
#define DUMP_UNKNOWN_PACKET 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 <ctype.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)
//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 in_addr_t map_ip;
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) {
// /m /mapmove (as @rura GM command)
char output[30]; // 17+4+4=26, 30 max.
char message[34]; // "/mm "+output
char map_name[MAP_NAME_LENGTH]; //Err... map names are 15+'\0' in size, not 16+'\0' [Skotlex]
char output[MAP_NAME_LENGTH+15]; // Max length of a short: ' -6XXXX' -> 7 digits
char message[MAP_NAME_LENGTH+15+5]; // "/mm "+output
char *map_name;
RFIFOHEAD(fd);
if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
(pc_isGM(sd) >= get_atcommand_level(AtCommand_MapMove))) {
memcpy(map_name, RFIFOP(fd,2), MAP_NAME_LENGTH-1);
if (battle_config.atc_gmonly && !pc_isGM(sd))
return;
if(pc_isGM(sd) < get_atcommand_level(AtCommand_MapMove))
return;
map_name = RFIFOP(fd,2);
map_name[MAP_NAME_LENGTH-1]='\0';
sprintf(output, "%s %d %d", map_name, RFIFOW(fd,18), RFIFOW(fd,20));
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);
log_atcommand(sd, message);
}
}
return;
}
@ -8950,7 +8955,8 @@ void clif_parse_Wis(int fd, struct map_session_data *sd) { // S 0096 <len>.w <ni
msg = command;
msg+= sprintf(command, "%s : ", sd->status.name);
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) ||
(is_atcommand(fd, sd, command) != AtCommand_None)) {
aFree(command);
@ -9118,7 +9124,7 @@ void clif_parse_GMmessage(int fd, struct map_session_data *sd) {
size = WFIFOW(fd,2)-4;
mes = RFIFOP(fd,4);
mes_len_check(mes, size);
mes_len_check(mes, size, CHAT_SIZE);
intif_GMmessage(mes, size, 0);
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) {
RFIFOHEAD(fd);
if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
pc_isGM(sd) >= get_atcommand_level(AtCommand_ResetState)) {
switch(RFIFOW(fd,2)){
case 0:
pc_resetstate(sd);
break;
case 1:
if (battle_config.atc_gmonly && !pc_isGM(sd))
return;
if (pc_isGM(sd) < get_atcommand_level(AtCommand_ResetState))
return;
if (RFIFOW(fd,2))
pc_resetskill(sd,1);
break;
}
if((log_config.gm) && (get_atcommand_level(AtCommand_ResetState) >= log_config.gm)) {
else
pc_resetstate(sd);
if(log_config.gm && get_atcommand_level(AtCommand_ResetState >= log_config.gm))
log_atcommand(sd, RFIFOW(fd,2) ? "/resetskill" : "/resetstate");
}
}
}
/*==========================================
* 019c /lb等
@ -10130,7 +10134,7 @@ void clif_parse_LGMmessage(int fd, struct map_session_data *sd) {
len = RFIFOW(fd,2) - 4;
mes = RFIFOP(fd,4);
mes_len_check(mes, len);
mes_len_check(mes, len, CHAT_SIZE);
WBUFW(buf,0) = 0x9a;
WBUFW(buf,2) = len+4;
@ -10364,7 +10368,7 @@ void clif_parse_PartyMessage(int fd, struct map_session_data *sd) {
RFIFOHEAD(fd);
len = RFIFOW(fd,2) - 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 ||
is_atcommand(fd, sd, mes) != AtCommand_None)
@ -10641,7 +10645,7 @@ void clif_parse_GuildMessage(int fd,struct map_session_data *sd) {
RFIFOHEAD(fd);
len = RFIFOW(fd,2) - 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 ||
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) {
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;
memset(monster_item_name, '\0', sizeof(monster_item_name));
if (battle_config.atc_gmonly == 0 || pc_isGM(sd)) {
RFIFOHEAD(fd);
memcpy(monster_item_name, RFIFOP(fd,2), NAME_LENGTH);
if (mobdb_searchname(monster_item_name) != 0) {
if (pc_isGM(sd) >= (level =get_atcommand_level(AtCommand_Spawn))) // changed from AtCommand_Monster for Skots [Reddozen]
{
if (battle_config.atc_gmonly && !pc_isGM(sd))
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
if(log_config.gm && level >= log_config.gm)
{ //Log action. [Skotlex]
snprintf(monster_item_name, sizeof(monster_item_name)-1, "@spawn %s", RFIFOP(fd,2));
log_atcommand(sd, monster_item_name);
snprintf(message, sizeof(message)-1, "@spawn %s", monster_item_name);
log_atcommand(sd, message);
}
return;
}
} else if (itemdb_searchname(monster_item_name) != NULL) {
if (pc_isGM(sd) >= (level = get_atcommand_level(AtCommand_Item)))
{
if (itemdb_searchname(monster_item_name) == NULL)
return;
if (pc_isGM(sd) < (level = get_atcommand_level(AtCommand_Item)))
return;
atcommand_item(fd, sd, "@item", monster_item_name); // as @item
if(log_config.gm && level >= log_config.gm)
{ //Log action. [Skotlex]
snprintf(monster_item_name, sizeof(monster_item_name)-1, "@item %s", RFIFOP(fd,2));
log_atcommand(sd, monster_item_name);
}
}
}
sprintf(message, "@item %s", monster_item_name);
log_atcommand(sd, message);
}
}
void clif_parse_GMHide(int fd, struct map_session_data *sd) { // Modified by [Yor]
if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
(pc_isGM(sd) >= get_atcommand_level(AtCommand_Hide))) {
if (battle_config.atc_gmonly && !pc_isGM(sd))
return;
if (pc_isGM(sd) < get_atcommand_level(AtCommand_Hide))
return;
if (sd->sc.option & OPTION_INVISIBLE) {
sd->sc.option &= ~OPTION_INVISIBLE;
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.");
} else {
sd->sc.option |= OPTION_INVISIBLE;
//Experimental hidden mode, changes your view class to invisible [Skotlex]
sd->vd.class_ = INVISIBLE_CLASS;
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");
}
}
clif_changeoption(&sd->bl);
}
}
/*==========================================
* GMによるチャット禁止時間付与

View File

@ -159,11 +159,11 @@ enum {
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'
//(also used for Graffiti, Talkie Box, Vending, and Chatrooms)
#define MESSAGE_SIZE 80
//String length you can write in the 'talking box'
#define CHATBOX_SIZE 70
#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);
break;
case WZ_STORMGUST:
if (tsc)
{ //This should be safe as skill_additional_effect
//won't be triggered if the attack is absorbed. [Skotlex]
//And if the target is already frozen,
//the counter is reset when it ends.
if (skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0) > 0
&& tsc)
{ //Increase freeze counter if attack connects.
if (tsc->data[SC_FREEZE].val4 == sg->group_id)
tsc->data[SC_FREEZE].val3++; //SG hit counter.
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;
}
}
break;
default:
skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
}