MUD 游戏物品丢弃功能代码优化:提高游戏体验并解决潜在漏洞
#include <config.h>
inherit F_CLEAN_UP;
int do_drop(object me, object obj, int raw);
void create() { seteuid(getuid()); }
int main(object me, string arg) { object obj, *inv, obj2; int i, amount; mixed info; string item;
if (!arg)
return notify_fail("你要丢下什么东西?\n");
if (sscanf(arg, "%d %s", amount, item) == 2)
{
if (!objectp(obj = present(item, me)))
return notify_fail("你身上没有这样东西。\n");
if (wiz_level(me) < 3 && (info = obj->query("no_drop")))
{
tell_object(me, stringp(info) ? info : obj->name() + "不能被丢弃。\n");
return 1;
}
if (!obj->query_amount())
return notify_fail(obj->name() + "不能被分开丢弃。\n");
if (amount < 1)
return notify_fail("东西的数量至少是一个。\n");
if (amount > obj->query_amount())
return notify_fail("你没有那么多的" + obj->name() + "。\n");
if (amount == (int)obj->query_amount())
{
if (!do_drop(me, obj, 0))
{
obj->move(environment(me));
return 0;
}
tell_object(me, "你丢下了" + obj->short() + "。\n");
message("vision", me->name() + "丢下了一" + obj->query("unit") + obj->name() + "。\n", environment(me), ({ me }));
return 1;
}
else
{
obj->set_amount((int)obj->query_amount() - amount);
obj2 = new(base_name(obj));
obj2->set_amount(amount);
if (!do_drop(me, obj2, 0))
{
obj2->move(environment(me));
return 0;
}
tell_object(me, "你丢下了" + obj2->short() + "。\n");
message("vision", me->name() + "丢下了一" + obj2->query("unit") + obj2->name() + "。\n", environment(me), ({ me }));
return 1;
}
}
if (arg == "all")
{
if (!wizardp(me))
return notify_fail("只有巫师可以这样操作。\n");
inv = all_inventory(me);
for (amount = 0, i = 0; i < sizeof(inv); i++)
{
if (!living(me)) break;
amount += do_drop(me, inv[i], 1);
}
if (!amount)
{
write("你什么都没有丢掉。\n");
return 1;
}
message("vision", me->name() + "丢下了一堆东西。\n", environment(me), ({ me }));
write("丢完了。\n");
return 1;
}
if (!objectp(obj = present(arg, me)))
return notify_fail("你身上没有这样东西。\n");
do_drop(me, obj, 0);
return 1;
}
int do_drop(object me, object obj, int raw) { if (obj->query("equipped")) { tell_object(me, "你必须先解除装备" + obj->name() + "才能丢掉它。\n"); return 0; }
if (obj == me->query_temp("is_riding"))
{
message_vision("$N从$n背上飞身跳下。\n", me, obj);
me->delete_temp("is_riding");
obj->delete_temp("is_rided_by");
obj->move(environment(me));
return 1;
}
if (wiz_level(me) < 3 && obj->query("no_drop"))
{
tell_object(me, obj->name() + "不能被丢弃。\n");
return 0;
}
mixed no_drop = environment(me)->query("no_drop");
if (no_drop)
{
if (stringp(no_drop))
tell_object(me, no_drop + "\n");
else
tell_object(me, "这里东西丢弃下去也看不见。\n");
return 0;
}
if (!raw)
message_vision("$N丢下一" + obj->query("unit") + obj->name() + "。\n", me);
if (obj->move(environment(me)))
{
if (!obj->query("value") && !obj->value())
{
tell_object(me, obj->name() + "没有具体价值,被丢弃了。\n");
destruct(obj);
}
return 1;
}
return 0;
}
int help(object me) { write(@HELP 指令格式:drop <物品名称> | all
这个指令可以让你丢下你所携带的物品。
HELP); return 1;
原文地址: https://www.cveoy.top/t/topic/m5Wq 著作权归作者所有。请勿转载和采集!