channeld.c
来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C语言 代码 · 共 475 行 · 第 1/2 页
C
475 行
if( channels[verb]["eschat_only"] && !wizardp(me)) return 0; if( channels[verb]["arch_only"] && wiz_level(me)<wiz_level("(arch)")) return 0; // check if same channel message but not wizard if( !wizardp(me)) if( arg==(string)me->query_temp("last_channel_msg") ) return notify_fail("用交谈频道说话请不要重复相同的讯息。\n"); if( userp(me) && !wizardp(me)) { me->set_temp("last_channel_msg", arg); me->add_temp("channel_msg_cnt", 1); if (me->query_temp("channel_msg_cnt")>5) if (time()-me->query_temp("chat_time")<2){ me->set("chblk_channel/"+verb,time()); do_channel( this_object(), "rumor", sprintf("悔天鬼王拿出一张狗皮膏药,在小火炉上细细地煨热以后,“啪”地捂住了%s的嘴巴。\n", me->name(1) )); return 1; }else{ me->set_temp("chat_time",time()); me->delete_temp("channel_msg_cnt"); } } // If we speaks something in this channel, then must tune it in. tuned_ch = me->query("channels"); if( !pointerp(tuned_ch) ) me->set("channels", ({ verb }) ); else if( member_array(verb, tuned_ch)==-1 ) me->set("channels", tuned_ch + ({ verb }) ); } // Support of channel emote if( emote && me->is_character() && !remote) { string vb, emote_arg, id, mud; if( sscanf(arg, "%s %s", vb, emote_arg)!= 2 ) { vb = arg; emote_arg = ""; } if( channels[verb]["intermud_emote"] && sscanf(emote_arg, "%s@%s", id, mud)==2 ) { REMOTE_Q->send_remote_q(mud, verb, me->query("id"), id, vb); write("网路讯息已送出,请稍候。\n"); return 1; } if( channels[verb]["intermud_emote"] ) arg = EMOTE_D->do_emote(me, vb, emote_arg, 3); else if( verb == "rumor" && random(10)<7 && !wizardp(me)) arg = EMOTE_D->do_emote(me, vb, emote_arg, 2, channels[verb]["anonymous"]); else arg = EMOTE_D->do_emote(me, vb, emote_arg, 1); if (!arg && emote) { // we should only allow chinese emote. if( (int)vb[0] < 160 ) return 0; arg = sprintf("%s(%s@%s)%s\n",me->name(),me->query("id"),Mud_name(),arg_bk); if( verb == "rumor" ) { if( userp(me) ) arg = sprintf("%s%s\n",channels[verb]["anonymous"],vb); } } if( !arg ) { if( channels[verb]["anonymous"] ) arg = channels[verb]["anonymous"]+vb+" "+emote_arg+"\n"; else if( channels[verb]["intermud_emote"] ) arg = sprintf("%s(%s@%s)%s %s\n", me->name(1), capitalize(me->query("id")), INTERMUD_MUD_NAME, vb, emote_arg); else arg = me->name()+vb+" "+emote_arg+"\n"; } } // Make the identity of speaker. if( channels[verb]["anonymous"] ) { who = channels[verb]["anonymous"]; if (userp(me)) if (random(10)>8 && !wizardp(me)) who=me->name(1) + "(" + capitalize(me->query("id")) + ")"; else do_channel( this_object(), "sys", sprintf("%s躲了起来造谣。", me->name(1))); } else if(me && (userp(me) || !stringp(who = me->query("channel_id")) )) { if (me->name()!=me->name(1) && emote) do_channel( this_object(), "sys", sprintf(HIW"%s(%s)"+WHT+"扮%s!", me->name(1),me->query("id"),me->name())); who = me->name(1) + "(" + capitalize(me->query("id")) + ")"; } if( verb == "adm" ) { who = sprintf("%s", RANK_D->query_rank(me)); who = replace_string(who," ",""); who = replace_string(who,NOR,""); who +=(me->name(1)+"("+capitalize(me->query("id"))+")"); } // Ok, now send the message to those people listening us. if (verb=="party"){ if (!me->query("family/family_name")) return notify_fail(YEL"你还没有加入任何门派!\n"NOR); ob=filter_array( users(), "family_listener", this_object(), me->query("family/family_name") ); }else ob = filter_array( users(), "filter_listener", this_object(), channels[verb] ); if( !arg || arg == "" || arg == " " ) arg = "..."; if( emote ) { string localmsg; string ecol=channels[verb]["msg_color"]; if(remote) { arg=arg_bk; } if (!stringp(arg)) return 0; localmsg = arg; if ( channels[verb]["msg_emote"] ) localmsg = remove_addresses(arg, 0); // 98-1-22 14:30 if( channels[verb]["omit_address"] ) localmsg = remove_addresses(arg, 1); else if( channels[verb]["intermud_emote"] ) localmsg = remove_addresses(arg, 0); if(!stringp(localmsg)) return 0; if (verb=="party") message( "channel:" + verb,sprintf( channels[verb]["msg_emote"],me->query("family/family_name"), replace_string(localmsg,NOR,ecol) ), ob ); else message( "channel:" + verb, sprintf( channels[verb]["msg_emote"],replace_string(localmsg,NOR,ecol)), ob ); } else if (verb=="party") message( "channel:" + verb,sprintf( channels[verb]["msg_speak"],me->query("family/family_name"),who,arg ), ob ); else message( "channel:" + verb, sprintf( channels[verb]["msg_speak"], who, arg ), ob ); if( arrayp(channels[verb]["extra_listener"]) ) { channels[verb]["extra_listener"] -= ({ 0 }); if( sizeof(channels[verb]["extra_listener"]) ) channels[verb]["extra_listener"]->relay_channel(me, verb, arg); } if( !undefinedp(channels[verb]["intermud"]) && me->is_character()) { channels[verb]["intermud"]->send_msg( channels[verb]["channel"], me->query("id"), me->name(1), arg, emote, channels[verb]["filter"] ); } if(verb != "adm" && verb != "debug" && verb != "sys" && verb != "wiz" && verb != "snp" && verb != "gbwiz" //在这里把一些非玩家频道屏蔽掉,根据具体情况修改 && verb != "gwiz") // if(verb = "chat" // || verb = "rumor" // || verb = "sys" // || verb = "party" // || verb = "hy" // || verb = "yqyl") //在这里把一些非玩家频道屏蔽掉,根据具体情况修改 write_file("/log/NEWS", arg+"\n", 1); //写一个log,要在ask npc about news 时用到 return 1;}int filter_listener(object ppl, mapping ch){ // Don't bother those in the login limbo. if( !environment(ppl) ) return 0; if( ch["arch_only"]) if( userp(ppl) ) if( wiz_level(ppl) < wiz_level("(arch)") ) return 0; if( ch["wiz_only"] ) if( userp(ppl) ) return wizardp(ppl); if( ch["eschat_only"] ) return 0; if( ch["es_only"] ) { if( wiz_level(ppl) > 0 ) return 1; if( ppl->query("age") > 23 ) return 1; return 0; } return 1;}void register_relay_channel(string channel){ object ob; ob = previous_object(); if( undefinedp(channels[channel]) || !ob) return; if( arrayp(channels[channel]["extra_listener"]) ) { if( member_array(ob, channels[channel]["extra_listener"]) >=0 ) return; channels[channel]["extra_listener"] += ({ ob }); } else channels[channel]["extra_listener"] = ({ ob });}string remove_addresses(string msg, int all){ int i; mixed tmp; string pattern; if(!stringp(msg)) return msg; if( all ) pattern = "[(][A-Za-z]+@[a-zA-Z]+[0-9]+[.]?[)]"; else pattern = "[(][A-Za-z]+@"+Mud_name()+"[)]"; tmp = reg_assoc(msg, ({pattern}), ({1})); if(!arrayp(tmp)) return msg; msg = ""; for(i=0; i< sizeof(tmp[0]); i++) if( tmp[1][i] == 0 ) msg += tmp[0][i]; return msg;}int family_listener(object ppl, string str){ // Don't bother those in the login limbo. if( !environment(ppl)) return 0; if(wizardp(ppl) || ppl->query("family/family_name")==str ) return 1; else return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?