// Oxxy (C) 2015, HPM plugin. #include #include #include #include "../common/HPMi.h" #include "../common/malloc.h" #include "../common/mmo.h" #include "../common/socket.h" #include "../common/strlib.h" #include "../map/clif.h" #include "../map/script.h" #include "../map/pc.h" #include "../common/HPMDataCheck.h" /* should always be the last file included! (if you don't make it last, it'll intentionally break compile time) */ HPExport struct hplugin_info pinfo = { "Chat Color", // Plugin name SERVER_TYPE_MAP,// Which server types this plugin works with? "0.1", // Plugin version HPM_VERSION, // HPM Version (don't change, macro is automatically updated) }; ACMD(color) { if(!message || !*message) { clif->message(fd, "Usage: @color "); clif->message(fd, " must be in hex format. Starting with 0x"); clif->message(fd, "Example: @color 0x00FF00"); if(pc_readglobalreg_str(sd,script->add_str("CHAT_COLOR$")) = "") { clif->message(fd, "Defaulting your color to green."); pc_setglobalreg_str(sd, script->add_str("CHAT_COLOR$"), "0x000000"); return 1; } return -1; } else { pc_setglobalreg_str(sd, script->add_str("CHAT_COLOR$"), message); clif->message(fd, "Color has been set."); } return 1; } int messageSending(int *fd, struct map_session_data* sd) { // validate packet and retrieve name and message if( !clif->process_message(sd, 0, &name, &namelen, &message, &messagelen) ) return; if( atcommand->exec(fd, sd, message, true) ) return; if( !pc->can_talk(sd) ) return; if( battle_config.min_chat_delay ) { //[Skotlex] if (DIFF_TICK(sd->cantalk_tick, timer->gettick()) > 0) return; sd->cantalk_tick = timer->gettick() + battle_config.min_chat_delay; } if( (sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE ) { unsigned int next = pc->nextbaseexp(sd); if( next == 0 ) next = pc->thisbaseexp(sd); if( next ) { // 0%, 10%, 20%, ... int percent = (int)( ( (float)sd->status.base_exp/(float)next )*1000. ); if( (battle_config.snovice_call_type || percent) && ( percent%100 ) == 0 ) {// 10.0%, 20.0%, ..., 90.0% switch (sd->state.snovice_call_flag) { case 0: if( strstr(message, msg_txt(1479)) ) // "Dear angel, can you hear my voice?" sd->state.snovice_call_flag = 1; break; case 1: { char buf[256]; snprintf(buf, 256, msg_txt(1480), sd->status.name); if( strstr(message, buf) ) // "I am %s Super Novice~" sd->state.snovice_call_flag = 2; } break; case 2: if( strstr(message, msg_txt(1481)) ) // "Help me out~ Please~ T_T" sd->state.snovice_call_flag = 3; break; case 3: sc_start(NULL,&sd->bl, status->skill2sc(MO_EXPLOSIONSPIRITS), 100, 17, skill->get_time(MO_EXPLOSIONSPIRITS, 5)); //Lv17-> +50 critical (noted by Poki) [Skotlex] clif->skill_nodamage(&sd->bl, &sd->bl, MO_EXPLOSIONSPIRITS, 5, 1); // prayer always shows successful Lv5 cast and disregards noskill restrictions sd->state.snovice_call_flag = 0; break; } } } } if( battle_config.idletime_criteria & BCIDLE_CHAT ) sd->idletime = sockt->last_tick; if( sd->gcbind ) { channel->send(sd->gcbind,sd,message); return; } else if ( sd->fontcolor && !sd->chatID ) { char mout[200]; unsigned char mylen = 1; if( sd->disguise == -1 ) { sd->fontcolor_tid = timer->add(timer->gettick()+5000, clif->undisguise_timer, sd->bl.id, 0); pc->disguise(sd,sd->status.class_); if( pc_isdead(sd) ) clif->clearunit_single(-sd->bl.id, CLR_DEAD, sd->fd); if( unit->is_walking(&sd->bl) ) clif->move(&sd->ud); } else if ( sd->disguise == sd->status.class_ && sd->fontcolor_tid != INVALID_TIMER ) { const struct TimerData *td; if( (td = timer->get(sd->fontcolor_tid)) ) { timer->settick(sd->fontcolor_tid, td->tick+5000); } } const char* text = (char*)RFIFOP(fd,4); char mout[200]; unsigned char mylen = 1; char *name, *message, *fakename = NULL; size_t namelen, messagelen; unsigned long *color1, color2; char *tmp = pc_readglobalreg_str(sd, script->add_str("CHAT_COLOR$")); if(tmp != NULL) color2 = strtoul(tmp, NULL, 0); mylen += snprintf(mout, 200, "%s : %s",sd->fakename[0]?sd->fakename:sd->status.name,message); if(color2 1= "") // if CHAT_COLOR$ != "" WFIFOL(*fd,8) = (color2&0x0000FF) << 16 | (color2&0x00FF00) | (color2&0xFF0000) >> 16; // RGB -> BGR else // if CHAT_COLOR == "" WFIFOL(*fd,8) = (color1&0x0000FF) << 16 | (color1&0x00FF00) | (color1&0xFF0000) >> 16; // RGB -> BGR safestrncpy((char*)WFIFOP(*fd,12), *mout, *mylen); clif->send(WFIFOP(fd,0), WFIFOW(fd,2), &sd->bl, AREA_WOS); } HPExport void plugin_init (void) { char *server_type; char *server_name; /* core vars */ iMalloc = GET_SYMBOL("iMalloc"); script = GET_SYMBOL("script"); clif = GET_SYMBOL("clif"); pc = GET_SYMBOL("pc"); addAtcommand("color", color); //addScriptCommand("color","is",color) addHookPre("clif->pGlobalMessage", messageSending); } HPExport void server_online (void) { ShowInfo ("'%s' Plugin by Oxxy. Version '%s'\n",pinfo.name,pinfo.version); }