#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;

MUD 游戏物品丢弃功能代码优化:提高游戏体验并解决潜在漏洞

原文地址: https://www.cveoy.top/t/topic/m5Wq 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录