//请不要照搬以下代码，因为各个MUD的实际情况都不太一样，请在理解的基础上再进行修改  Jackyboy
//这是一些应该增加的定义
#define TMA “\x19”  //ASCII码25
#define TMB “\x1A”  //ASCII码26
#define TMI(x) (TMA+x+TMB)
#define ALERT(x) TMI("alert "+x)
#define L_ITEM(x) RANK_D->new_short(x)
#define L_ICON(x) TMI("licon "+x)
#define CLEAN0  TMI("lbclear0")
#define ADD0(x) TMI("lbadd0 "+L_ITEM(x)+";")
#define REM0(x) TMI("lbrem0 "+L_ITEM(x)+";")
#define CLEAN1  TMI("lbclear1")
#define ADD1(x) TMI("lbadd1 "+L_ITEM(x)+";")
#define REM1(x) TMI("lbrem1 "+L_ITEM(x)+";")
#define CLEAN2  TMI("lbclear2")
#define ADD2(x) TMI("lbadd2 "+L_ITEM(x)+";")
#define REM2(x) TMI("lbrem2 "+L_ITEM(x)+";")

//注意，你必须正确的使用上面这些定义，而且最好注意不要把对TOMUD客户端用户的信息发送给所有人，否则会导致ZMUD用户无法进行游戏，
//当然，如果你只考虑支持TOMUD协议当然就无所谓了。
/* 这个new_short()不一定非要放到RANK_D里的。。。
//RANK_D->new_short()
//形成物品的ItemString By JackyBoy@TOMUD 2002/1/6
varargs string new_short( object ob ,int withshort)
{
	mixed tmp;
	string icon="", str;
	if(!objectp(ob))
	{
		CHANNEL_D->do_channel(this_player(),"chat","object参数错误！");
		return "";
	}
	if(!ob->query_temp("apply/id")||!ob->query_temp("apply/name")||!ob->query_temp("apply/short"))
		str = ob->query("name") + "(" +ob->query("id") + ")" +(!withshort?"":ob->short());
	else
		str = ob->query_temp("apply/name")[0] + "(" +ob->query_temp("apply/id")[0] + ")" +(!withshort?"":ob->query_temp("apply/short")[0]);
	if( (tmp = ob->query("icon")))
	{
		if( intp(tmp) )
			icon = sprintf("%d",tmp);
		else if( stringp(tmp) )
			icon = tmp;
		else 
			icon = "00901";
	}
	else
	{
		if(userp(ob)) icon=( ob->query("gender") == "男性" )?"1174":"1173";
		else if(living(ob)) icon = "00901";
		else icon = "00961";
	}
	while( sizeof(icon)<5 )
		icon = "0" + icon;

    return str + icon;
}
*/
==========================================================================================================================
/* 下面是实现列表功能需要用到的代码。可以从http://bbs.tomud.com/dl/move.c 得到屠所使用的代码
//把这段代码插到feature/move.c里的move()函数的最后。完成列表的增加和删除功能
//Modify By JackyBoy@TOMUD 2002/1/6
	if(!wizardp(this_object())||!query("env/invisible"))
	{
		if (env)
		{
			env->add_encumbrance(-weight());
			if(userp(env)) tell_object(env,REM1(this_object()) ); //如果是从玩家身上移动走，则应该是REM1
			else if(!living(env)) tell_room(env,REM0(this_object()),this_object() );//如果是从房间里移动走，则应该是REM0
			//else log_file("move.log",ctime(time())+"：不知道如何显示REM消息---"+base_name(env)+"\n");
		}
		if (ob)
		{
			ob->add_encumbrance(weight());
			if(userp(ob)||interactive(ob)) tell_object(ob,ADD1(this_object()) ); //如果是移动到玩家身上，则应该是ADD1
			else if(!ob->is_character()) tell_room(ob,ADD0(this_object()),this_object() );//如果是移动到房间里，则应该是ADD0
		}
	}
//& 把这段代码插到/feature/move.c里的remove()函数里，必须要找到合适的地方！这样可以从列表里去掉该物件或玩家
		//Add By JackyBoy@TOMUD 2002/1/27
		if(userp(ob))
			tell_object(ob,REM1(me) ); //如果是从玩家身上移动走，则应该是REM1
		else if(!living(ob)&&!ob->is_character())
			tell_room(ob,REM0(me),me );//如果是从房间里移动走，则应该是REM0（下线！）
*/
================================================================================================
//把下面的代码插入到who命令里
if(arg=="我爱笑傲江湖")
{
	str = "";
	ob = users();
	i = sizeof(ob);
	while ( i -- )
	{
		if ( !ob[i] )
			continue;
		if ( !environment(ob[i]) ) 
		{
			destruct(ob[i]);//有点危险
			continue;
		}
		str += ADD2(ob[i]);
	}

	write(CLEAN2+str);
	return 1;
}

================================================================================================

//下面是actionavailable命令的代码请放到/cmds/std/actionavailable.c里
// actionavailable.c

#include <ansi.h>
#include <weapon.h>
#include <login.h>
inherit F_CLEAN_UP;

int room_path(object, object);
int user_path(object, object);

int main(object me, string arg)
{
	object ob, *inv;
	string win,*ids;

	if( sscanf(arg, "%s,%s", arg, win)!=2) return 0;
	switch (win){
		case "0" :
			ob=present(arg,environment(me));
			if(!objectp(ob)) {
				inv=all_inventory(environment(me));
				for(int i = 0; i<sizeof(inv); i++) {
					if(inv[i]==me) continue;
					if(ids=inv[i]->query_temp("apply/id"))
					for(int j=0;j<sizeof(ids);j++) {
						if(ids[j]==arg)
						ob=inv[i];
					}
				}
			}
			room_path(me,ob);
			break;
		case "1" :
			ob=present(arg,me);
			user_path(me,ob);
			break;
	}
	return 1;
}

int room_path(object me, object ob)
{
	mapping skills,meskills;
	object *inv;
	string *str,id,*ids,name,tmp;
	int i,my_skill;

	if(!objectp(ob)) return 1;
	
	if(stringp(tmp=ob->query_menu(me,0)))//如果对象能解释菜单，则直接返回菜单
	{
		write(tmp);
		return 1;
	}
	

	if(!ob->query("apply/id")) id=ob->query("id");
	else {
		ids=ob->query_temp("apply/id");
		id=ids[sizeof(ids)-1];
	}

//	if(ob->query_temp("apply/name")) name=ob->query_temp("apply/name");
	tmp=TMI("mbegin "+ob->name(1)+";"+id)+TMI("mitem 观察$U;look "+id);
	if(living(ob))
	{
		if(interactive(ob))
		{
			tmp+=TMI("mitem 告诉$U...;tell "+id+" ...")+TMI("mitem 对$U耳语...;whisper "+id+" ...");
			if(id==me->query_temp("reply"))
				write(TMI("mitem 回答$U...;reply ..."));
		}

		tmp+=(me->query_leader()==ob)?TMI("mitem 停止跟随$U;follow none"):TMI("mitem 跟随$U;follow "+id);
		if(!environment(me)->query("no_fight"))
		{
			tmp+=TMI("mitem 与$U切磋;fight "+id);
			if ((int)ob->query("age") > 17 || !interactive(ob))
				tmp+=TMI("mitem 攻击$U;hit "+id)+TMI("mitem 杀死$U;kill "+id)+TMI("mitem 偷袭$U;touxi "+id)+TMI("mitem 偷$U的...;steal ... from "+id);
		}
		if(ob->query("inquiry")) {
			str=keys(ob->query("inquiry"));
			for(i=0; i<sizeof(str); i++)
				tmp+=TMI("mitem 向$U打听关于"+str[i]+"的信息;ask "+id+" about "+str[i]+"");
		}
		tmp+=TMI("mitem 给$U...东西;give ... to "+id );
		if(me->query("family/family_name") == "丐帮" ) {
			if ( me->query_skill("checking",1) >= 10 )
				tmp+=TMI("mitem 打探...的技能;check ...");
			if(ob->query("family/family_name") != "丐帮" )
				tmp+=TMI("mitem 乞讨$U的...;beg ... from "+id);
		}
		if(ob->query("vendor_goods")) {
			tmp+=TMI("mitem 查询$U出售的东西;list");
			tmp+=TMI("mitem 向$U买...;buy ...");
		}
		if(ob->query("dealer")=="pawn") {
			if(!ob->query("vendor_goods")) {
				tmp+=TMI("mitem 查询$U出售的东西;list");
				tmp+=TMI("mitem 向$U买...;buy ...");
			}
			tmp+=TMI("mitem 估价...;value ...");
			tmp+=TMI("mitem 卖...给$U;sell ...");
			tmp+=TMI("mitem 典当...给$U;pawn ...");
			if(me->query("pawns"))
				tmp+=TMI("mitem 赎回物品...;redeem ...");
		}
		if(ob->query("dealer")=="bank") {
			tmp+=TMI("mitem 兑换货币;convert ...");
			tmp+=TMI("mitem 存钱;deposit ...");
			if(me->query("money")) {
				tmp+=TMI("mitem 查询存款;check");
				tmp+=TMI("mitem 取钱;withdraw ...");
			}
		}
		if(me->query("family/master_name")!=ob->name(1)) {
			if(ob->is_master())
				tmp+=TMI("mitem 拜$U为师;bai "+id);
		} else {
			tmp+=TMI("mitem 向师父$U磕头;bai "+id);
			tmp+=TMI("mitem 查询师父$U技能;skills "+id);
			if(ob->query_skills() && me->query("jing")>=1
				&& (int)me->query("potential")>(int)me->query("learned_points")) {
				skills=ob->query_skills();
				str=keys(skills);
				for(i=0; i<sizeof(str); i++) {
					if(me->query_skills()) {
						meskills=me->query_skills();
						my_skill = me->query_skill(str[i], 1);
						if( (string)SKILL_D(str[i])->type()=="martial"
							&& my_skill*my_skill*my_skill/10>(int)me->query("combat_exp") )
							continue;
						if(skills[str[i]]>my_skill && str[i]!="idle")
							tmp+=TMI("mitem 学习"+to_chinese(str[i])+";learn "+id+" "+str[i]+" ...");
					} else
					tmp+=TMI("mitem 学习"+to_chinese(str[i])+";learn "+id+" "+str[i]+" ...");
				}
			}
		}
	} else {
		if(!ob->query("no_get"))
			tmp+=TMI("mitem 把$U捡起来;get "+id);
		if(ob->is_container()) {
			inv = all_inventory(ob);
			if(sizeof(inv)) {
				tmp+=TMI("mitem 把$U里的东西都拿出来;get all from "+id);
				tmp+=TMI("mitem 从$U里拿出...;get ... from "+id);
			}
			tmp+=TMI("mitem 把...装进$U里;put ... in "+id);
		}
		if(id=="board") {
			tmp+=TMI("mitem 读新的留言;read new");
			tmp+=TMI("mitem 读第...条留言;read ...");
			tmp+=TMI("mitem 写新的留言;post ...");
			tmp+=TMI("mitem 删除留言...;discard ...");
		}
	}
	tmp+=TMI("mendd");
	tell_object(me,tmp);
	return 1;
}

int user_path(object me, object ob)
{
	mapping prop;
	string id,tmp;

	if(!objectp(ob)) return 1;
	
	if(stringp(tmp=ob->query_menu(me,1)))//如果对象能解释菜单，则直接返回菜单
	{
		write(tmp);
		return 1;
	}
	
	id=ob->query("id");
	tmp=TMI("mbegin "+ob->name(1)+";"+id)+TMI("mitem 观察$U;look "+id);

	if(!ob->query("no_drop"))
		tmp+=TMI("mitem 丢弃$U;drop "+id);

	if(!ob->query("no_give"))
		tmp+=TMI("mitem 把$U给...;give "+id+" to ...");

	if(ob->query("liquid")) {
		if(ob->query("liquid/remaining"))
			tmp+=TMI("mitem 喝$U;drink "+id);
		if(environment(me)->query("resource/water"))
			tmp+=TMI("mitem 把$U装满水;fill "+id);
	}
	
	if(ob->query("food_remaining"))
		tmp+=TMI("mitem 吃$U;eat "+id);
		
	if(ob->is_container()) {
		tmp+=TMI("mitem 把$U里的东西都拿出来;get all from "+id);
		tmp+=TMI("mitem 从$U里拿出...;get ... from "+id);
		tmp+=TMI("mitem 把...装进$U里;put ... in "+id);
	}
	if(mapp(prop=ob->query("armor_prop"))&& stringp(ob->query("armor_type")) ) {
		if(!ob->query("equipped"))
			tmp+=TMI("mitem 穿上$U;wear "+id);
		else
			tmp+=TMI("mitem 脱下$U;remove "+id);
	}

	if(mapp(prop=ob->query("weapon_prop")) && stringp(ob->query("skill_type"))) {
		if(!ob->query("equipped"))
			tmp+=TMI("mitem 装备$U;wield "+id);
		else
			tmp+=TMI("mitem 解除装备$U;unwield "+id);
	}

	if(ob->query("skill"))
		tmp+=TMI("mitem 读$U;study "+id);
	tmp+=TMI("mendd");
	tell_object(me,tmp);
	return 1;
}


================================================================================================

//如果要支持QQ私聊，请复制一个tell命令到ctell命令，然后将给对方的信息修改一下
//TMI("ctell name="+my_name+";ID="+my_id+";icon="+me->query("icon")+";"+tell_out);  其中tell_out是给对方的信息

//支持信息查询，请加这个命令qqinfo  /cmds/std/qqinfo.c
/*个人信息查询命令
带参数，查询某人
不带参数，查询自己的。
*/

int main(object me,string arg)
{
	object obj;
	string str;
	if(!arg)
		obj=me;
	if(arg&&sscanf(arg,"set %s",arg))
	{
	        arg=replace_string(arg,"\"","");
	        arg=replace_string(arg,"'","");
	        arg=replace_string(arg,"\\","");
		me->set("qqinfo",arg);
		write(ALERT("你的个人信息已经设置成功!\n"));
		return 1;
	}
	if(arg&&!objectp(obj))
		obj = UPDATE_D->global_find_player(arg);
	if(!objectp(obj)) return notify_fail(ALERT("无法查询对方信息。"));
	if(stringp(str=obj->query("qqinfo")))
	{
		write(TMI("qqinfo"+((obj==me)?"0":"1")+" "+str));
		return 1;
	}
	write(TMI("qqinfo"+((obj==me)?"0":"1")+""));
	if(obj->query_temp("temp_loaded"))
		UPDATE_D->global_destruct_player(obj,0);
	return 1;
}

================================================================================================

//要允许用户设置自己的头像，请加入下面的命令 icon.c /cmds/usr/icon.c
#include <ansi.h>

inherit F_CLEAN_UP;

int help();

int main(object me,string arg)
{
	mixed tmp;
	int ico;
	string str="",icon=HIR"空，没有设置"NOR;
	if( (tmp = me->query("icon")))
	{
		if( intp(tmp) )
		{
			icon = sprintf("%d",tmp);
			str=L_ICON(icon);
		}
		else if( stringp(tmp) )
		{
			icon = tmp;
			str=L_ICON(icon);
		}
	}

	str+=NOR+"你原来的头像编号是"+HIY+icon+NOR+"！\n";

	if(arg)
	{
		if(sscanf(arg,"%d",ico)!=1||ico<=0||ico>=MAX_ICONS)
			return help();
		icon=sprintf("%d",ico);
		while( sizeof(icon)<5 )	icon = "0" + icon;
		str+="它已经被修改为"+HIG+icon+NOR+"了！\n";
		me->set("icon",icon);
	}
	else help();
	tell_object(me,str);
	return 1;
}

int help()
{
	write("命令格式："+HIY+"icon [图标编号]\n"+NOR+
		"    你可以用本命令查询和修改自己的头像编号。\n"+
		"    你可以去[http://www.qqchat.net]查询和选择自己的头像图标编号。\n"+
		"    目前图标可以选择范围是"+HIR+" 1 - "+MAX_ICONS+NOR+" 。\n");
	return 1;
}





