diff options
author | ultramage <ultramage@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2008-01-15 15:05:11 +0000 |
---|---|---|
committer | ultramage <ultramage@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2008-01-15 15:05:11 +0000 |
commit | 0aac9d598500a6aadabd1cfb0a9904b877bd5393 (patch) | |
tree | ae8e37f7b1ad958e344277dce7e6788c09aa480a /src/map | |
parent | 6bec408e8f75856b0bf17577dc1b1df4e22a5257 (diff) | |
download | hercules-0aac9d598500a6aadabd1cfb0a9904b877bd5393.tar.gz hercules-0aac9d598500a6aadabd1cfb0a9904b877bd5393.tar.bz2 hercules-0aac9d598500a6aadabd1cfb0a9904b877bd5393.tar.xz hercules-0aac9d598500a6aadabd1cfb0a9904b877bd5393.zip |
* Manner system fixing
- better-than-aegis 'red bubble' packet updates; now it shows correctly
- added support for /rc, which is basically mute for 60 minutes
- fixed typo in r12076 making gm-mute start on the gm instead of target
- fixed @mute not ending the status properly when using negative values
- adde missing clif_manner_message(), sends info about manner updates
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@12079 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/map')
-rw-r--r-- | src/map/atcommand.c | 14 | ||||
-rw-r--r-- | src/map/clif.c | 108 | ||||
-rw-r--r-- | src/map/clif.h | 3 | ||||
-rw-r--r-- | src/map/status.c | 7 |
4 files changed, 97 insertions, 35 deletions
diff --git a/src/map/atcommand.c b/src/map/atcommand.c index cc6e21874..ea8a1d163 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -6744,10 +6744,18 @@ int atcommand_mute(const int fd, struct map_session_data* sd, const char* comman return -1; } - clif_GM_silence(sd, pl_sd, 0); - pl_sd->status.manner -= manner; - if(pl_sd->status.manner < 0) + clif_manner_message(sd, 0); + clif_manner_message(pl_sd, 5); + + if( pl_sd->status.manner < manner ) { + pl_sd->status.manner -= manner; sc_start(&pl_sd->bl,SC_NOCHAT,100,0,0); + } else { + pl_sd->status.manner = 0; + status_change_end(&pl_sd->bl,SC_NOCHAT,-1); + } + + clif_GM_silence(sd, pl_sd, (manner > 0 ? 1 : 0)); return 0; } diff --git a/src/map/clif.c b/src/map/clif.c index 4b0b7e7ec..3b15f3e1a 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -2180,7 +2180,6 @@ int clif_updatestatus(struct map_session_data *sd,int type) break; case SP_MANNER: WFIFOL(fd,4)=sd->status.manner; - clif_changestatus(&sd->bl,SP_MANNER,sd->status.manner); break; case SP_STATUSPOINT: WFIFOL(fd,4)=sd->status.status_point; @@ -3405,9 +3404,6 @@ static void clif_getareachar_pc(struct map_session_data* sd,struct map_session_d ) clif_hpmeter_single(sd->fd, dstsd->bl.id, dstsd->battle_status.hp, dstsd->battle_status.max_hp); - if(dstsd->status.manner < 0) - clif_changestatus(&dstsd->bl,SP_MANNER,dstsd->status.manner); - // pvp circle for duel [LuzZza] //if(dstsd->duel_group) // clif_specialeffect(&dstsd->bl, 159, 4); @@ -6899,23 +6895,42 @@ int clif_GM_kick(struct map_session_data *sd,struct map_session_data *tsd,int ty return 0; } -int clif_GM_silence(struct map_session_data *sd, struct map_session_data *tsd, int type) +/// Displays various manner-related status messages +/// R 014a <type>.L +/// type: 0 - "A manner point has been successfully aligned." +/// 1 - ? +/// 2 - ? +/// 3 - "Chat Block has been applied by GM due to your ill-mannerous action." +/// 4 - "Automated Chat Block has been applied due to Anti-Spam System." +/// 5 - "You got a good point from %s." +void clif_manner_message(struct map_session_data* sd, uint32 type) { int fd; + nullpo_retv(sd); - nullpo_retr(0, sd); - nullpo_retr(0, tsd); + fd = sd->fd; + WFIFOHEAD(fd,packet_len(0x14a)); + WFIFOW(fd,0) = 0x14a; + WFIFOL(fd,2) = type; + WFIFOSET(fd, packet_len(0x14a)); +} + +/// Followup to 0x14a type 3/5, informs who did the manner adjustment action. +/// R 014b <type>.B <GM name>.24B +/// type: 0 - positive (unmute) +/// 1 - negative (mute) +void clif_GM_silence(struct map_session_data* sd, struct map_session_data* tsd, uint8 type) +{ + int fd; + nullpo_retv(sd); + nullpo_retv(tsd); fd = tsd->fd; - if (fd <= 0) - return 0; WFIFOHEAD(fd,packet_len(0x14b)); WFIFOW(fd,0) = 0x14b; - WFIFOB(fd,2) = 0; - memcpy(WFIFOP(fd,3), sd->status.name, NAME_LENGTH); + WFIFOB(fd,2) = type; + safestrncpy((char*)WFIFOP(fd,3), sd->status.name, NAME_LENGTH); WFIFOSET(fd, packet_len(0x14b)); - - return 0; } /*========================================== @@ -10391,42 +10406,74 @@ void clif_parse_GMHide(int fd, struct map_session_data *sd) } /*========================================== - * GM adjustment of a player's manner value - * /red + * GM adjustment of a player's manner value (right-click GM menu) * S 0149 <id>.L <type>.B <value>.W * type: 0 - positive points * 1 - negative points + * 2 - self mute (+10 minutes) *------------------------------------------*/ void clif_parse_GMReqNoChat(int fd,struct map_session_data *sd) { - int type, value, level; + int id, type, value, level; struct map_session_data *dstsd; - dstsd = map_id2sd(RFIFOL(fd,2)); + id = RFIFOL(fd,2); type = RFIFOB(fd,6); value = RFIFOW(fd,7); - if (type == 0) + if( type == 0 ) value = 0 - value; //If type is 2 and the ids don't match, this is a crafted hacked packet! //Disabled because clients keep self-muting when you give players public @ commands... [Skotlex] - if (type == 2/* && sd->bl.id != dstsd->bl.id*/) + if (type == 2 /* && (pc_isGM(sd) > 0 || sd->bl.id != id)*/) return; - - if ( - ((level = pc_isGM(sd)) > pc_isGM(dstsd) && level >= get_atcommand_level(atcommand_mute)) - || (type == 2 && !level)) + + dstsd = map_id2sd(id); + if( dstsd == NULL ) + return; + + if( (level = pc_isGM(sd)) > pc_isGM(dstsd) && level >= get_atcommand_level(atcommand_mute) ) { - clif_GM_silence(sd, dstsd, ((type == 2) ? 1 : type)); - dstsd->status.manner -= value; - if(dstsd->status.manner < 0) - sc_start(&sd->bl,SC_NOCHAT,100,0,0); - else - { + clif_manner_message(sd, 0); + clif_manner_message(dstsd, 5); + + if( dstsd->status.manner < value ) { + dstsd->status.manner -= value; + sc_start(&dstsd->bl,SC_NOCHAT,100,0,0); + } else { dstsd->status.manner = 0; - status_change_end(&sd->bl,SC_NOCHAT,-1); + status_change_end(&dstsd->bl,SC_NOCHAT,-1); } + + if( type != 2 ) + clif_GM_silence(sd, dstsd, type); + } +} + +/*========================================== + * GM adjustment of a player's manner value by -60 (using name) + * /rc <name> + * S 0212 <name>.24B + *------------------------------------------*/ +void clif_parse_GMRc(int fd, struct map_session_data* sd) +{ + char* name = (char*)RFIFOP(fd,2); + struct map_session_data* dstsd; + name[23] = '\0'; + dstsd = map_nick2sd(name); + if( dstsd == NULL ) + return; + + if( pc_isGM(sd) > pc_isGM(dstsd) && pc_isGM(sd) >= get_atcommand_level(atcommand_mute) ) + { + clif_manner_message(sd, 0); + clif_manner_message(dstsd, 3); + + dstsd->status.manner -= 60; + sc_start(&dstsd->bl,SC_NOCHAT,100,0,0); + + clif_GM_silence(sd, dstsd, 1); } } @@ -11942,6 +11989,7 @@ static int packetdb_readdb(void) {clif_parse_GMShift,"remove"}, {clif_parse_GMShift,"shift"}, {clif_parse_GMChangeMapType,"changemaptype"}, + {clif_parse_GMRc,"rc"}, {clif_parse_NoviceDoriDori,"sndoridori"}, {clif_parse_NoviceExplosionSpirits,"snexplosionspirits"}, diff --git a/src/map/clif.h b/src/map/clif.h index 5933a40e0..3b188a468 100644 --- a/src/map/clif.h +++ b/src/map/clif.h @@ -362,7 +362,8 @@ int clif_message(struct block_list *bl, const char* msg); // messages (from mobs int clif_GM_kickack(struct map_session_data *sd,int id); int clif_GM_kick(struct map_session_data *sd,struct map_session_data *tsd,int type); -int clif_GM_silence(struct map_session_data *sd,struct map_session_data *tsd,int type); +void clif_manner_message(struct map_session_data* sd, uint32 type); +void clif_GM_silence(struct map_session_data* sd, struct map_session_data* tsd, uint8 type); int clif_timedout(struct map_session_data *sd); int clif_disp_overhead(struct map_session_data *sd, const char* mes); diff --git a/src/map/status.c b/src/map/status.c index 4108359d8..ce33bceeb 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -5212,7 +5212,11 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val case SC_NOCHAT: tick = 60000; val1 = battle_config.manner_system; //Mute filters. - if (sd) clif_updatestatus(sd,SP_MANNER); + if (sd) + { + clif_changestatus(&sd->bl,SP_MANNER,sd->status.manner); + clif_updatestatus(sd,SP_MANNER); + } break; case SC_STONE: @@ -6922,6 +6926,7 @@ int status_change_timer(int tid, unsigned int tick, int id, int data) case SC_NOCHAT: if(sd){ sd->status.manner++; + clif_changestatus(bl,SP_MANNER,sd->status.manner); clif_updatestatus(sd,SP_MANNER); if (sd->status.manner < 0) { //Every 60 seconds your manner goes up by 1 until it gets back to 0. |