[Intermédiaire] Ajouter un "additem" pour les joueurs
Bonjour !

Voilà, je vous propose un "additem" mais pour les joueurs.

Le but de ce script est de donner au joueur, une nouvelle commande qui permettra d'ajouter au joueur un objet.

Seul les objets que vous aurez mis dans la table "item_player" seront disponibles à l'ajout.

Sur les quelques petits tests que j'ai fait, je n'ai vu aucun bug, si jamais vous en trouvez, merci de me le faire parvenir par MP ou sur le sujet Smile

Les commandes:
.item list => Affiche la liste des items disponibles
.item add #id => Ajoute au joueur l'objet choisi

Voici le fichier CPP:
/*
 * © - Crisou
 * C'est mon script, j'ai mis du temps à le réaliser.
 * Merci de respecter mon travail et donc, de ne pas
 * enlever ce commentaire !
 */

#include "Chat.h"
#include "Player.h"
#include "RBAC.h"
#include "ScriptMgr.h"

class cs_item : CommandScript
{
public:
	cs_item() : CommandScript("cs_item") { }

	ChatCommand* GetCommands() const
	{
		static ChatCommand itemCommandTable[] =
		{
			{ "list", rbac::RBAC_PERM_COMMAND_ITEM_LIST, true, &HandleItemListCommand, "", NULL },
			{ "add", rbac::RBAC_PERM_COMMAND_ITEM_ADD, false, &HandleItemAddCommand, "", NULL },
			{ NULL,	0,								false,		NULL,       					"", NULL },
		};

		static ChatCommand commandTable[] = 
		{
			{ "item",	rbac::RBAC_PERM_COMMAND_ITEM, true, NULL, "", itemCommandTable },
			{ NULL,	0,								false,		NULL,       					"", NULL },
		};
		return commandTable;
	}

	static bool HandleItemListCommand(ChatHandler * handler, const char * args)
	{
		QueryResult result = WorldDatabase.PQuery(
                	"SELECT id, name, quantity FROM item_player");

		if(!result)
			return false;

		Field* field = result->Fetch();

		if(!field)
		{
			handler->PSendSysMessage("Aucun objet disponible n'a été trouvé.");
			return false;
		}

		do {
			uint32 id = field[0].GetUInt32();
			std::string name = field[1].GetString();
			uint16 quantity = field[2].GetUInt16();

			handler->PSendSysMessage("  %i - [%s]x%i", id, name, quantity);
		} while(result->NextRow());

        return true;
	}

	static bool HandleItemAddCommand(ChatHandler * handler, const char * args)
	{
		if(!*args)
			return false;

		int32 item_id = atoi(args);

		QueryResult result = WorldDatabase.PQuery(
			"SELECT id, entry, name, quantity FROM item_player WHERE id = %i", item_id);

		if(!result)
		{
			handler->PSendSysMessage(
				"L'objet demandé est introuvable. Avez-vous sélectionné la bonne id ? (%i)", item_id);
			return false;			
		}

		Field* field = result->Fetch();
		uint32 id = field[0].GetUInt32();
		uint32 entry = field[1].GetUInt32();
		std::string name = field[2].GetString();
		uint16 quantity = field[3].GetUInt16();

		handler->GetSession()->GetPlayer()->AddItem(entry, quantity);
		handler->PSendSysMessage(">> Vous avez bien reçu [%s]x%i.", name, quantity);

		return true;
	}
};

void AddSC_item_commandscript()
{
	new cs_item();
}

Vous devez bien sûr, ajouter les trois lignes dans votre fichier RBAC.h avec vos id à vous.

RBAC_PERM_COMMAND_ITEM,
RBAC_PERM_COMMAND_ITEM_LIST
RBAC_PERM_COMMAND_ITEM_ADD
​

Et la table en SQL:

DROP TABLE IF EXISTS `item_player`;
CREATE TABLE `item_player` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `entry` int(10) NOT NULL DEFAULT '0',
  `name` varchar(255) NOT NULL DEFAULT '<none>',
  `quantity` int(10) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of item_player
-- ----------------------------
INSERT INTO `item_player` VALUES ('1', '25', 'Worn Shortsword', '1');

Descriptif de la table item_player:

id => L'id de la ligne (Elle est en Auto increment, donc inutile de la spécifier)
entry => C'est l'ID de l'objet (item_template.entry)
name => C'est le nom que vous voulez afficher lors de la commande .item list
quantity => C'est la quantité donnée au joueur lors de la commande .item add X

Voilà voilà Smile !

Plus qu'a compiler votre core, ajouter les permissions dans votre base de données (Et oui, même si on donne un script, faut quand même réfléchir Smile )

Amicalement !

Retourner en haut WoW-Emu