Jump to content

GM Command - Do Item Creator


Recommended Posts

  • Bot

Here:

cmd_gm.cpp

FUNCTIONS:

#include <iostream>
#include <vector>
#include <string>

void split(const std::string& s, char delim, std::vector<std::string>& v) {
	int i = 0;
	int pos = s.find(delim);
	while (pos != std::string::npos)
	{
		v.push_back(s.substr(i, pos-i));
		i = ++pos;
		pos = s.find(delim, pos);
		if (pos == std::string::npos) v.push_back(s.substr(i, s.length()));
	}
}

int countChars(char* s, char c)
{
	return *s == '\0' ? 0 : countChars( s + 1, c ) + (*s == c);
}

COMMAND:

ACMD(do_create_item)
{
	char item[256];
	char bonus[1024];
	two_arguments(argument, item, sizeof(item), bonus, sizeof(bonus));
	if (!*item || !*bonus)
	{
		ch->ChatPacket(CHAT_TYPE_INFO, "Usage: /create_item <value_item> <b1:v1,b2:v2,b3:v3,b4:v4,b5:v5,b6:v6,b7:v7>");
		ch->ChatPacket(CHAT_TYPE_INFO, "");
		ch->ChatPacket(CHAT_TYPE_INFO, "[b] = Bonus vnum");
		ch->ChatPacket(CHAT_TYPE_INFO, "[v] = Bonus value");
		ch->ChatPacket(CHAT_TYPE_INFO, "");
		ch->ChatPacket(CHAT_TYPE_INFO, "Created by RaFFa.");
		return;
	}
	if (bonus[(strlen(bonus)-1)] == ',') {
		ch->ChatPacket(CHAT_TYPE_INFO, "<CreateItem> [Err1] Syntax Error.");
		return;
	}
	if (bonus[(strlen(bonus)-1)] == ':') {
		ch->ChatPacket(CHAT_TYPE_INFO, "<CreateItem> [Err2] Syntax Error.");
		return;
	}
	if (strstr(bonus, ":") == NULL) {
		ch->ChatPacket(CHAT_TYPE_INFO, "<CreateItem> [Err3] Syntax Error.");
		return;
	}
	if (strstr(bonus, ",") == NULL) {
		ch->ChatPacket(CHAT_TYPE_INFO, "<CreateItem> Adding 1 bonus...");
		int vnum=0;
		str_to_number(vnum, item);
		LPITEM i = ITEM_MANAGER::instance().CreateItem(vnum);
		if (!i) {
			ch->ChatPacket(CHAT_TYPE_INFO, "<CreateItem> This item-vnum not exists.");
			return;
		}
		int bonus_vnum=0;
		int bonus_value=0;
		std::vector<std::string> bonus2;
		split(std::string(bonus), ':', bonus2);
		str_to_number(bonus_vnum, std::string(bonus2[0]).c_str());
		str_to_number(bonus_value, std::string(bonus2[1]).c_str());
		i->SetForceAttribute(0, bonus_vnum, bonus_value);
		i->SetSocket(0, 1);
		int inventario = ch->GetEmptyInventory(i->GetSize());
		if (inventario != -1) {
			i->AddToCharacter(ch, TItemPos(INVENTORY, inventario));
			ch->ChatPacket(CHAT_TYPE_INFO, "<CreateItem> Item created successfully.");
		}else{
			M2_DESTROY_ITEM(i);
			ch->ChatPacket(CHAT_TYPE_INFO, "<CreateItem> You haven't enough space in inventory.");
		}
	}else{
		std::vector<std::string> bonus1;
		split(std::string(bonus), ',', bonus1);
		if (bonus1.size()>0) {
			ch->ChatPacket(CHAT_TYPE_INFO, "<CreateItem> Adding %d bonus...", (int)bonus1.size());
			if (countChars(bonus, ':') != (int)bonus1.size()) {
				ch->ChatPacket(CHAT_TYPE_INFO, "<CreateItem> [Err4] Syntax Error.");
				return;				
			}
			int vnum=0;
			str_to_number(vnum, item);
			LPITEM i = ITEM_MANAGER::instance().CreateItem(vnum);
			if (!i) {
				ch->ChatPacket(CHAT_TYPE_INFO, "<CreateItem> This item-vnum not exists.");
				return;
			}
			int b_size=bonus1.size();
			if (bonus1.size()>6) b_size=7;
			int bonus_vnum=0;
			int bonus_value=0;
			for (int n=0; n<b_size; n++) {
				std::vector<std::string> bonus2;
				split(std::string(bonus1[n]), ':', bonus2);
				str_to_number(bonus_vnum, std::string(bonus2[0]).c_str());
				str_to_number(bonus_value, std::string(bonus2[1]).c_str());
				i->SetForceAttribute(n, bonus_vnum, bonus_value);
			}
			i->SetSocket(0, 1);
			int inventario = ch->GetEmptyInventory(i->GetSize());
			if (inventario != -1) {
				i->AddToCharacter(ch, TItemPos(INVENTORY, inventario));
				ch->ChatPacket(CHAT_TYPE_INFO, "<CreateItem> Item created successfully!");
			}else{
				M2_DESTROY_ITEM(i);
				ch->ChatPacket(CHAT_TYPE_INFO, "<CreateItem> You haven't enough space in inventory.");
			}
		}
	}
}

cmd.cpp

ACMD(do_create_item);

and:

(into the struct command_info cmd_info[])

{"create_item", do_create_item, 0, POS_DEAD, GM_IMPLEMENTOR},

 

  • Love 3

english_banner.gif

Link to comment
Share on other sites

Why you didn't use boost to split? Wouldn't it be easier like this:

std::string arguments  = "arg1,arg2,arg3";
std::vector<std::string> container;
boost::split(container,arguments,boost::is_any_of(","));
// container.push_back("test");
for (auto & element : container)
{
	printf("Output: %s\n", element.c_str());
}

 

  • Love 1
Link to comment
Share on other sites

  • 3 weeks later...
  • 10 months later...

Announcements



×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.