What's new

openShopWindow

Status
Not open for further replies.

Vergil93

Advanced User
Joined
Jun 19, 2010
Messages
263
Reaction score
6
Chcia?bym by kto?, kto zna si? na tym, przerobi? mi ten skrypt, znaleziony w sourach, tak aby okienko Trade otwiera?o si? niezale?nie od tego w jaki spos?b b?dzie otwierane. W skrypcie jest, ?e tylko NPCty mog? otwiera? nam to okienko, a ja chc? by mo?na by?o je otwiera? w ka?dym momencie, nie tylko poprzez NPCty.
PHP:
void Player::openShopWindow()
{
	sendShop();
	sendGoods();
}

void Player::closeShopWindow(Npc* npc/* = NULL*/, int32_t onBuy/* = -1*/, int32_t onSell/* = -1*/)
{
	if(npc || (npc = getShopOwner(onBuy, onSell)))
		npc->onPlayerEndTrade(this, onBuy, onSell);

	if(shopOwner)
		sendCloseShop();

	shopOwner = NULL;
	purchaseCallback = saleCallback = -1;
	shopOffer.clear();
}

bool Player::canShopItem(uint16_t itemId, uint8_t subType, ShopEvent_t event)
{
	for(ShopInfoList::iterator sit = shopOffer.begin(); sit != shopOffer.end(); ++sit)
	{
		if(sit->itemId != itemId || ((event != SHOPEVENT_BUY || sit->buyPrice < 0)
			&& (event != SHOPEVENT_SELL || sit->sellPrice < 0)))
			continue;

		if(event == SHOPEVENT_SELL)
			return true;

		const ItemType& it = Item::items[id];
		if(it.isFluidContainer() || it.isSplash() || it.isRune())
			return sit->subType == subType;

		return true;
	}

	return false;
}
 

Sassin

Forum friend
Joined
Jun 13, 2009
Messages
1,281
Reaction score
107
Odp: openShopWindow

Jak sobie to wyobra?asz? Chcesz, ?eby np. przez funkcje onUse mo?na by?o otworzy? okno trade, czy jak?
 

Vergil93

Advanced User
Joined
Jun 19, 2010
Messages
263
Reaction score
6
Odp: openShopWindow

Dok?adnie tak jak m?wisz.
Poprzez funkcj? onUse czy onStepIn otwiera okienko trade.
Pr?bowa?em w ten sam spos?b jak w moim skrypcie Grizzly Adams, ale tamten spos?b chyba dzia?a tylko w plikach NPC.
 

Sassin

Forum friend
Joined
Jun 13, 2009
Messages
1,281
Reaction score
107
Odp: openShopWindow

Tak i ci??ko b?dzie zrobi? tak jak Ty chcesz (cho? nie m?wi?, ?e mo?liwe to nie jest), ?eby to osi?gn?? b?dzie trzeba stworzy? multum nowych funkcji, kt?re b?d? dodawa?y item'y do tego okna itd.
Reasumuj?c - my?l?, ?e poziom forum nie pozwala na to, aby od tak napisa? to komu? 'free'.
My?l?, ?e da?bym rad? to osi?gn??, ale jak pewnie si? domy?lasz nie zrobi? tego od tak.
 

sawex

Advanced User
Joined
Aug 17, 2008
Messages
421
Reaction score
23
Odp: openShopWindow

Je?eli chodz o to ?e player otwiera taki sklep to ja co? takiego mam.

A je?eli chodzi ?eby poprostu sklep na odleg?o?? otwiera? z jakiego? npc to gmmg prosta funkcja w c++ wystarczy chyba.
 

Vergil93

Advanced User
Joined
Jun 19, 2010
Messages
263
Reaction score
6
Odp: openShopWindow

Wyja?ni? co potrzebuj?, mo?e wtedy wszystko b?dzie jasne.
Gracz sobie idzie, znajduje, za???my ?e pos?g i daje na niego "use", po tej akcji pojawia si? nam okienko trade.

#Sassin
Dodawanie item?w do okienka trade jest proste, tutaj masz przyk?ad:
PHP:
local huntsMan_rank = {
					{id=11208, buy=0, sell=50, name="antlers"},
					{id=10549, buy=0, sell=100, name="bloody pincers"},
					{id=11183, buy=0, sell=35, name="crab pincers"},
					{id=10573, buy=0, sell=55, name="cyclops toe"},
					{id=10564, buy=0, sell=30, name="frosty ear of a troll"},
					{id=11193, buy=0, sell=600, name="hydra head"},
					{id=11366, buy=0, sell=80, name="lancer beetle shell"},
					{id=10578, buy=0, sell=420, name="mutated bat ear"},
					{id=11222, buy=0, sell=400, name="sabretooth"},
					{id=11367, buy=0, sell=20, name="sandcrawler shell"},
					{id=10547, buy=0, sell=280, name="scarab pincers"},
					{id=11365, buy=0, sell=60, name="terramite legs"},
					{id=11363, buy=0, sell=170, name="terramite shell"},
					{id=11184, buy=0, sell=30000, name="terrorbird beak"},
					
					{id=7398, buy=0, sell=500, name="cyclops trophy"},
					{id=7401, buy=0, sell=500, name="minotaur trophy"}
					}
local items = {}
for _, item in ipairs(huntsMan_rank) do
	items[item.id] = {storage = item.storage, item_id = item.id, buyPrice = item.buy, sellPrice = item.sell, subType = 0, realName = item.name}
end

local onBuy = function(cid, item, subType, amount, ignoreCap, inBackpacks)
	if items[item].buyPrice ~= 0 then
		doPlayerRemoveMoney(cid, amount * items[item].buyPrice)
		for i = 1, amount do
			doPlayerAddItem(cid, items[item].item_id, amount)
		end
		doNPCTalkALot(cid, 200, {"You bought "..amount.." "..items[item].realName.." for "..items[item].buyPrice * amount.." gold coins."})
	end
end
 
local onSell = function(cid, item, subType, amount, ignoreCap, inBackpacks)
	if items[item].sellPrice ~= 0 then
		doPlayerAddMoney(cid, items[item].sellPrice * amount)
		doPlayerRemoveItem(cid, items[item].item_id, amount)
		doNPCTalkALot(cid, 200, {"You sell "..amount.." "..items[item].realName.." for "..items[item].sellPrice * amount.." gold coins."})
	end
end

openShopWindow(cid, huntsMan_rank, onBuy, onSell)
Na przyk?adzie mojego Grizzly Adams. W plikach NPC dzia?a to doskonale, ale wrzucaj?c ten kod do actions przestaje dzia?a?.
 

sawex

Advanced User
Joined
Aug 17, 2008
Messages
421
Reaction score
23
Odp: openShopWindow

Poszukaj sobie w npc/lib gdzie? powinno by? okienko do sklepu. A jak nie zr?b to innowacyjnie troche :D
Chodzi mi o takiego schowanego npc kt?ry wy?apuje ludzi kt?rzy klikneli.
 

Vergil93

Advanced User
Joined
Jun 19, 2010
Messages
263
Reaction score
6
Odp: openShopWindow

Source nie pozwala... Potrafi kto? z edytowa? to tak by sz?o u?ywa? tej funkcji poza skryptami zwi?zanymi z NPC?
PHP:
void Player::openShopWindow()
{
	sendShop();
	sendGoods();
}

void Player::closeShopWindow(Npc* npc/* = NULL*/, int32_t onBuy/* = -1*/, int32_t onSell/* = -1*/)
{
	if(npc || (npc = getShopOwner(onBuy, onSell)))
		npc->onPlayerEndTrade(this, onBuy, onSell);

	if(shopOwner)
		sendCloseShop();

	shopOwner = NULL;
	purchaseCallback = saleCallback = -1;
	shopOffer.clear();
}

bool Player::canShopItem(uint16_t itemId, uint8_t subType, ShopEvent_t event)
{
	for(ShopInfoList::iterator sit = shopOffer.begin(); sit != shopOffer.end(); ++sit)
	{
		if(sit->itemId != itemId || ((event != SHOPEVENT_BUY || sit->buyPrice < 0)
			&& (event != SHOPEVENT_SELL || sit->sellPrice < 0)))
			continue;

		if(event == SHOPEVENT_SELL)
			return true;

		const ItemType& it = Item::items[id];
		if(it.isFluidContainer() || it.isSplash() || it.isRune())
			return sit->subType == subType;

		return true;
	}

	return false;
}
 

dominikms1

Senior User
Joined
Feb 6, 2010
Messages
696
Reaction score
66
Odp: openShopWindow

A gdyby? zrobi? tak.
Klikasz use na ten pos?g, pojawia si? niewidzialny npc i ten aktywule shopa??

Bardzo pami?cio?erne je?eli mam by? szczery. A ja pokombinowa?em i zrobi?bym to od zera - jedn? dodatkow? funkcj?, kt?ra jednocze?nie by dodawa?a itemki do okna, ale ja ju? patrz? na oszcz?dno?? i brak zb?dnej zabawy. //Sassin
 
Last edited by a moderator:

sawex

Advanced User
Joined
Aug 17, 2008
Messages
421
Reaction score
23
Odp: openShopWindow

zr?b ?e jak sie kliknie na pos?g to sie zmienia globalstorage na ciebie i npc ma w onthink ustawione ?e wy?apuje cz?owieka kt?ry jest na tym globalu zachowany!
I oczywi?cie je?eli dalej utrzym?je pozycje to ma otwarty sklep :eek:

To jest jeszcze bardziej obci??aj?ce dla serwera ni? pomys? wy?ej, ale jest sensowniejszy. - Jak m?wi? najoszcz?dniejszym sposobem by?oby zrobi? funkcj?, kt?ra by odpowiada?a za wszystko i unikn?? jaki? niepotrzebnych rzeczy typu:
  • przywo?ywanie NPC
  • nadawanie gStora
  • konieczno?? stania na jednej pozycji
  • usuwanie ?w gStora przy wylogowywaniu
itd. //Sassin
 
Last edited by a moderator:

Vergil93

Advanced User
Joined
Jun 19, 2010
Messages
263
Reaction score
6
Odp: openShopWindow

Mo?e Ty Sassin m?g?by? co? zaproponowa?? Bo faktycznie pomys?y z NPCtami s? dobre, ale pami?cio?erne, a tego chc? unikn??, gdy? skrypt b?dzie stosunkowo cz?sto u?ywany przez du?? liczb? graczy jednocze?nie.
 

Ghalla

Active User
Joined
Aug 24, 2010
Messages
88
Reaction score
12
Age
30
Odp: openShopWindow

W og?le kompletnie bezsensowne funkcje poda?e? w jednym ze swoich post?w.
Code:
int32_t NpcScriptInterface::luaOpenShopWindow(lua_State* L)
{
	//openShopWindow(cid, items, onBuy callback, onSell callback)
	ScriptEnviroment* env = getEnv();
	Npc* npc = env->getNpc();
	if(!npc)
	{
		errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND));
		lua_pushboolean(L, false);
		return 1;
	}

	int32_t sellCallback = -1;
	if(lua_isfunction(L, -1) == 0)
		lua_pop(L, 1); // skip it - use default value
	else
		sellCallback = popCallback(L);

	int32_t buyCallback = -1;
	if(lua_isfunction(L, -1) == 0)
		lua_pop(L, 1);
	else
		buyCallback = popCallback(L);

	if(!lua_istable(L, -1))
	{
		error(__FUNCTION__, "item list is not a table.");
		lua_pushboolean(L, false);
		return 1;
	}

	ShopInfoList itemList;
	lua_pushnil(L);
	while(lua_next(L, -2))
	{
		ShopInfo item;
		item.itemId = getField(L, "id");
		item.subType = getField(L, "subType");
		item.buyPrice = getField(L, "buy");
		item.sellPrice = getField(L, "sell");
		item.itemName = getFieldString(L, "name");

		itemList.push_back(item);
		lua_pop(L, 1);
	}

	lua_pop(L, 1);
	Player* player = env->getPlayerByUID(popNumber(L));
	if(!player)
	{
		errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));
		lua_pushboolean(L, false);
		return 1;
	}

	player->closeShopWindow();
	npc->addShopPlayer(player);

	player->setShopOwner(npc, buyCallback, sellCallback, itemList);
	player->openShopWindow();

	lua_pushboolean(L, true);
	return 1;
}

int32_t NpcScriptInterface::luaCloseShopWindow(lua_State* L)
{
	//closeShopWindow(cid)
	ScriptEnviroment* env = getEnv();

	Player* player = env->getPlayerByUID(popNumber(L));
	if(!player)
	{
		errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));
		lua_pushboolean(L, false);
		return 1;
	}

	Npc* npc = env->getNpc();
	if(!npc)
	{
		errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND));
		lua_pushboolean(L, false);
		return 1;
	}

	int32_t onBuy, onSell;
	Npc* merchant = player->getShopOwner(onBuy, onSell);
	if(merchant == npc)
		player->closeShopWindow(npc, onBuy, onSell);

	return 1;
}

Masz tutaj prawid?owe funkcje, na ich podstawie napisz sobie normalne funkcje w pliku luascript.h bo te s? rejestrowane przez NpcEventsHandler w npc.h
 

sawex

Advanced User
Joined
Aug 17, 2008
Messages
421
Reaction score
23
Odp: openShopWindow

Nie rozumie co takiego pami?cio?ernego?
Zrobisz ze ten npc w onthink to sprawdza np co 3 sekundy....
Bierze globala tam hmhmhm.... i je?eli sie to u postacie nie zgadza pozycja lub actionid pod?ogi gdzie stoi czy uid jest z?e to mu wywala sklep.

I to wcale nie jest jakie? pami?cio?erne bo w ci?gu sekundy silnik i tak musi zlata? kod onThink wszystkich npc na mapie.

A je?eli ma w configu z? globale sie nie zapisuj? to sie rozwi?za? problem z usuwaniem, ajak nie to poprostu npc widz?c ?? player na globalu sie nie zgadza to znowu robi go na -1.

Nie rozumie co takiego pami?cio?ernego?
Id? spa?. //Sassin
 
Last edited by a moderator:

Vergil93

Advanced User
Joined
Jun 19, 2010
Messages
263
Reaction score
6
Odp: openShopWindow

#Ghalla
Ja jestem zielony z C++, m?g?by? to jako? wyt?umaczy?? Wyja?ni? co gdzie i jak?
 

sawex

Advanced User
Joined
Aug 17, 2008
Messages
421
Reaction score
23
Odp: openShopWindow

Taka notka do Sassina... Troche to dziecinne ?e sie daje ostrze?enie bo kto? nie podziela twoich pogl?d?w... No ale co tam.
 

Vergil93

Advanced User
Joined
Jun 19, 2010
Messages
263
Reaction score
6
Odp: openShopWindow

Mo?e kto? jednak wyt?umaczy?
 
Status
Not open for further replies.
Top