Jump to content

borrar


caanmasu

Mensajes recomendados

En 9/10/2022 a las 6:37, caanmasu dijo:

Hola

 

He hecho un fix a una función, es algo sutil pero verán la diferencia.

Cuando usas en una quest la función:

game.drop_item(item_vnum, count)

o su variante game.drop_item_with_ownership, es para que caiga un objeto al suelo, ya sea sin nombre o con nombre.

Pero encontré un problema, resulta que en un evento había que matar a un jefe, y el jefe botaba objetos sin nombre para el que pudiera tomarlos. Se supone que el jefe bota los objetos debajo de él, pero el problema es que si matas al jefe desde lejos, van a caer los objetos debajo de ti.

La razón es esta:

questlua_game.cpp
 

	ALUA(game_drop_item)
	{
		//
		// Syntax: game.drop_item(50050, 1)
		//
		LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();

		DWORD item_vnum = (DWORD) lua_tonumber(L, 1);
		int count = (int) lua_tonumber(L, 2);
		long x = ch->GetX();
		long y = ch->GetY();

		LPITEM item = ITEM_MANAGER::instance().CreateItem(item_vnum, count);

		if (!item)
		{
			sys_err("cannot create item vnum %d count %d", item_vnum, count);
			return 0;
		}

		PIXEL_POSITION pos;
		pos.x = x + number(-200, 200);
		pos.y = y + number(-200, 200);

		item->AddToGround(ch->GetMapIndex(), pos);
		item->StartDestroyEvent();

		return 0;
	}

 

La instancia de quest recoge el personaje seleccionado, es decir, el personaje que dropea. Donde dice AddToGround, envía en el 2° parámetro la posición pero la posición la saca de ch->GetX(), es decir, las coordenadas del personaje. En otras palabras, el objeto caerá por debajo del personaje que mató al monstruo y no debajo del monstruo.

En este caso la solución es preguntar si hay un npc seleccionado, ya que si hacemos un game.drop_item() en un when login no interesa porque el objeto no tiene un objetivo distinto que del personaje. Pero si es un when kill, tiene que caer en el personaje seleccionado.

 

Fix:

Cambia la función por esta:

	ALUA(game_drop_item)
	{
		//
		// Syntax: game.drop_item(50050, 1)
		//
		LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();

		DWORD item_vnum = (DWORD) lua_tonumber(L, 1);
		int count = (int) lua_tonumber(L, 2);
		long x = ch->GetX();
		long y = ch->GetY();

		LPITEM item = ITEM_MANAGER::instance().CreateItem(item_vnum, count);

		if (!item)
		{
			sys_err("cannot create item vnum %d count %d", item_vnum, count);
			return 0;
		}

		CQuestManager& q = CQuestManager::instance();
		LPCHARACTER npc = q.GetCurrentNPCCharacterPtr();
		PIXEL_POSITION pos;
		if (npc && (npc->IsMonster() || npc->IsStone())){
			pos.x = npc->GetX() + number(-200, 200);
			pos.y = npc->GetY() + number(-200, 200);
		}
		else
		{
			pos.x = ch->GetX() + number(-200, 200);
			pos.y = ch->GetY() + number(-200, 200);
		}
		item->AddToGround(ch->GetMapIndex(), pos);
		item->StartDestroyEvent();

		return 0;
	}

Adapta también a la de game.drop_item_with_ownership().

 

Ya con el código pueden comparar y entender lo que he hecho. Si matan un metin o un monstruo y tienen el drop por game.drop_item... caerá el objeto sobre el mob.

 

Un saludo.

Problemas en base Revelion2 al utilizar "Lo cual muchos obejtos no caian"
No recomiendo.

Enlace para comentar
Compartir en otros sitios

  • caanmasu cambió el título a borrar

Unirse a la conversación

Puedes publicar ahora y registrarte más tarde. Si tienes una cuenta, regístrate para publicar con su cuenta.

Guest
Responder a este tema...

×   Has pegado contenido con formato .   Eliminar formato

  Only 75 emoji are allowed.

×   Tu enlace se ha incorporado automáticamente.   Mostrar un enlace en su lugar

×   Se ha restaurado el contenido anterior. .   Borrar editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recientemente navegando por este tema   0 miembros

    • No hay usuarios registrados visitando esta página.
×
×
  • Crear nuevo...