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 + -
显示快捷键?