What's new

Creaturescripts Party Loot Bonus - v. 1.0

Status
Not open for further replies.

Dantez

Moim sekretem jest ciasto
Joined
May 22, 2008
Messages
1,206
Reaction score
202
Witam! Jak w temacie - skrypt dodaje do corpse przedmioty, je?li gracz posiada party. Itemy przyznawane s? w zale?no?ci od wielko?ci party (liczby graczy).

Jak to wygl?da w praktyce?
partybonusloot.png


Co je?li gracze s? daleko od nas i wcale nie bili potwora?
partybonusloot2.png


A co gdybym ubi? go sam?
partybonusloot3.png


v. 1.2 Losowanie
partylootbonusroll.png

creaturescripts/scripts/login.lua
Pod:
Code:
registerCreatureEvent(cid, "AdvanceSave")
Dodaj:
Code:
registerCreatureEvent(cid, "PartyBoss")

creaturescripts/creaturescripts.xml
Code:
<event type="kill" name="PartyBoss" event="script" value="partyBoss.lua"/>

creaturescripts/scripts/partyBoss.lua
PHP:
local config = {
	rollItems = 1,
}

local array = {
["Example Boss"] = {
	[3] = {{2453, 1}},
	[4] = {{2493, 2}}
	},
	
["Ferumbras"] = {
	[2] = {{2160, 5}, {2159, 10}, {2472, 2}},
	[3] = {{2472, 2}, {2160, 40}},
	[4] = {{2493, 2}}
	},
}

function sendPartyMessage(members, msg)
	for _, pid in pairs(members) do
		doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, msg)
	end
return true 
end

function dropBonusLoot(items, corpseid, position, members)
local container = doAddContainerItem(getTileItemById(position, corpseid).uid, 1988, 1)
	for _, item in pairs(items) do
		doAddContainerItem(container, item[1], item[2])
	end
	sendPartyMessage(members, createLootMessage(container))
return true
end

function roll(items, members)
	for i=1, #items do
		local numbers, index, num = {}, 0, 0
		for _, person in pairs(members) do
			table.insert(numbers, {person, math.random(1, 100)})
		end
		
		for z, val in ipairs(numbers) do
			if (val[2] > num) then
				num = val[2]
				index = z
			end
		end
		doPlayerAddItem(numbers[index][1], items[i][1], items[i][2])
		sendPartyMessage(members, getCreatureName(numbers[index][1]) .. " rolled " .. numbers[index][2] .. " and gained " .. getItemNameById(items[i][1]) .. ".")
	end
	return true
end

function createLootMessage(container)
local text = "Party loot bonus: "

	for i=0, getContainerSize(container)-1 do
		local item = getContainerItem(container, i)
		if item ~= nil then
			local info = getItemInfo(item.itemid)
			if (item.type > 1 and info.stackable) then
				text = text .. item.type .. " " .. info.plural
			else
				if (info.article) then
					text = text .. info.article .. " " .. info.name
				else
					text = text .. info.name
				end
			end
		
			if (getContainerItem(container, i+1).itemid > 0 ) then 
				text = text .. ", "
			else
				text = text .. "."
			end
				
		else
			return text
		end
	end
return text
end

function partyMembersCheck(cid, members)
	for _, person in pairs(members) do
		if(getDistanceBetween(getCreaturePosition(cid), getCreaturePosition(person)) > 30) then
			return false
		end
	end
return true
end

function onKill(cid, target, lastHit)
	local corpseid, loot = getMonsterInfo(getCreatureName(target)).lookCorpse, array[getCreatureName(target)]
	if not (loot) or corpseid == nil or not isItemContainer(corpseid) then return true end
	
	if (isInParty(cid)) then
		local members, tab, items = getPartyMembers(getPartyLeader(cid)), 0, {}
		if (partyMembersCheck(cid, members)) then
			if (#members >= table.maxn(loot)) then tab = table.maxn(loot) else tab = #members end
			for i=2, tab do
				if (loot[i]) then
					for _, it in pairs(loot[i]) do
						if (it[2] > 1 and not getItemInfo(it[1]).stackable) then
							for x=1, it[2] do
								table.insert(items, {it[1], 1})
							end
						else
							table.insert(items, it)
						end
					end
				end
			end
				
			if #items > 0 then
				if (config.rollItems > 0) then
					roll(items, members)
				else
					addEvent(dropBonusLoot, 0, items, corpseid, getCreaturePosition(target), members)
				end
			end
		else
			doPlayerSendTextMessage(cid, 27, "Some party members are too far away. Bonus inactive.")
		end
	else
		doPlayerSendTextMessage(cid, 27, "Next time take some people in party to get bonus loot.")
	end
return true
end

Dodawanie nowych loot?w jest zupe?nie proste:
PHP:
["CREATURE NAME"] = {
-- [NUMBER OF PARTY MEMBERS] = {{ITEM_ID, ITEM_COUNT}, {ITEM2_ID, ITEM2_COUNT}}
	[2] = {{2160, 5}, {2159, 10}, {2472, 2}},
	[3] = {{2453, 1}, {2160, 50}},
	[4] = {{2493, 2}}
	}

Changelog:
Version 1.1:
  • New array form
  • Detect stackable and not stackable items (loot message)
  • Bonus loot is now in backpack

Version 1.2:
  • New Roll Items option!
  • Fixed bug with empty arrays.
  • Better messages - like normal loot (magic plate armor, magic plate armor).
  • When 3 players are in the same party you earn loot for 2 players too!
  • Some other bugs repaired.

Wszelkie b??dy oraz pomys?y prosz? zg?asza? w komentarzach :)
 

lordmarian

Advanced User
Joined
May 26, 2009
Messages
366
Reaction score
19
Odp: Party Loot Bonus - v. 1.0

Ale jak to dzieli? Np loot jest 20cc a w party jest 2 to leci im do bp po 10 czy jak? Jesli tak to co je?li jest 1 item?
 

Zafahix

Advanced User
Joined
Dec 5, 2009
Messages
356
Reaction score
27
Odp: Party Loot Bonus - v. 1.0

Nieee, ten skrypt dodaje do cia?a potwora po ?mierci bonusowe itemy, a dzielenie si? nimi to indywidualna sprawa :)
 

Dantez

Moim sekretem jest ciasto
Joined
May 22, 2008
Messages
1,206
Reaction score
202
Odp: Party Loot Bonus - v. 1.0

Ale jak to dzieli? Np loot jest 20cc a w party jest 2 to leci im do bp po 10 czy jak? Jesli tak to co je?li jest 1 item?

Loota wsadza do potworka, ale dzi?ki za pomys? - wykorzystam.
 

Dantez

Moim sekretem jest ciasto
Joined
May 22, 2008
Messages
1,206
Reaction score
202
Odp: Party Loot Bonus - v. 1.0

-- bump --
 

OldTejdi

Senior User
Joined
Jul 18, 2008
Messages
537
Reaction score
49
Odp: Party Loot Bonus - v. 1.0

Dobre, ?wietnie si? prezentuj?, lecz przyda?aby si? opcja nie tylko dla bossa lecz dla wszystkich potwor?w . : )
 

zygzagZ

Advanced User
Joined
Aug 14, 2008
Messages
281
Reaction score
34
Odp: Party Loot Bonus - v. 1.0

Lepiej sprawdzaj w
PHP:
function putInCorpse(items, corpseid, pos) 
local corpse = getTileItemById(pos, corpseid)
local container = doAddContainerItem(corpse.uid, 1987, 1) 
    for i=1, #items/2 do 
        doAddContainerItem(container, items[i], items[i+#items/2]) 
    end 
return true 
end
Czy corpse faktycznie jest. Najlepiej dzia?a:
if corpse.itemid < 99 then return true end
Oraz dodaj sprawdzanie po
PHP:
local corpseid = getMonsterInfo(getCreatureName(target)).lookCorpse
Czy corpseid ~= 0. Przecie? po co wykonywa? skrypt, skoro deada nie ma? A niekt?re potworki mog? nie mie? deada. Lepiej si? zabezpieczy? przed b??dami.
Drugie, sprawdzaj te?, czy corpse.uid na pewno jest kontenerem. Przecie? kto? mo?e doda? np. fire elementa. A field nie b?dzie containerem i wywali b??d...
Trzy. Cienko napisa?e? tabel? loota dla ilo?ci graczy. Przecie? jak kto? wpisze w 20 graczach demon armor, a w party b?dzie 21, to nie dostan? nic...
Daj warunek:
PHP:
if #members > #loot then jaka?tamzmienna = true end
a p??niej w
PHP:
addEvent(putInCorpse, 0, loot[#members], corpseid, getCreaturePosition(target))
zamiast loot[#members] daj np.
PHP:
loot[#members] or (jaka?tamzmienna and loot[#loot] or nil)
(z g?owy wi?c nie wiem czy b?dzie dzia?a?o)
Pomys? faktycznie niez?y, jednak z wykonaniem Dantez troszk? gorzej ;)
 
Last edited:

Dantez

Moim sekretem jest ciasto
Joined
May 22, 2008
Messages
1,206
Reaction score
202
Odp: Party Loot Bonus - v. 1.1

Odp: Party Loot Bonus - v. 1.1

Dobre, ?wietnie si? prezentuj?, lecz przyda?aby si? opcja nie tylko dla bossa lecz dla wszystkich potwor?w . : )
Wystarczy doda? do tablicy nazw? potworka...

@zygzagz
Z pocz?tku to wygl?da?o dobrze, a gdy pojawi?y si? problemy i kombinowanie co jest nie tak to si? wygl?d troch? zjeba? :D np. for podawa?em jak w C++, a potem wtf bo nie dzia?a

Co do corpse - zak?adam, ?e u?ytkownicy skryptu wiedz?, czy potworek ma corpse, czy te? nie. Og??em problem z containerem znam, ale ma?o czasu by go poprawi? - wczoraj jedynie co? mi si? uda?o napisa?, jednak to mi uciek?o. Teraz weekend to pomy?l?, czy nie przepisa? ca?o?ci na bardziej zaawansowany poziom. W ka?dym razie, postaram si? wyeliminowa? wszystkie b??dy. Dzi?ki za zg?oszenie :)

Ah, jeszcze kwestia loota - tutaj mam lekko inne plany.

@top
Version 1.1:
  • New array form
  • Detect stackable and not stackable items (loot message)
  • Bonus loot is now in backpack
 
Last edited:

OldTejdi

Senior User
Joined
Jul 18, 2008
Messages
537
Reaction score
49
Odp: Party Loot Bonus - v. 1.0

Dantez i uwa?asz, ?e mam wypisywa? wszystkie potworki z Tibii? : )
Czy jest jaki? inny spos?b?
@Topic
Oczywi?cie dzia?a : )
 

Dantez

Moim sekretem jest ciasto
Joined
May 22, 2008
Messages
1,206
Reaction score
202
Odp: Party Loot Bonus - v. 1.0

Tablica:
Code:
local loot = { 
    [2] = {{2160, 5}, {2159, 10}, {2472, 2}}, 
    [3] = {{2453, 1}}, 
    [4] = {{5803, 1}, {2160, 100}}
}

Usu? to:
Code:
    local loot = array[getCreatureName(target)] 
    if not (loot) then return true end

Teraz nawet w party mo?esz rata zabi? i ci spadnie to samo co z bonusu Demona. Chyba mija si? to z celem?
 

OldTejdi

Senior User
Joined
Jul 18, 2008
Messages
537
Reaction score
49
Odp: Party Loot Bonus - v. 1.0

Tak, nie zrozumieli?my si?. : D
Chodzi?o mi raczej o to, ?e gdy posta? A i posta? B s? w party, tworzy si? dodatkowy loot (tak jak jest to zrobione), lecz nie z Demona czy takie jak wpiszemy, lecz jest pobierany loot z potwora C i dodawany % loota do tego loota. Nie umiem tego wyt?umaczy? my?l?, ?e zrozumiesz. :D
 

Dantez

Moim sekretem jest ciasto
Joined
May 22, 2008
Messages
1,206
Reaction score
202
Odp: Party Loot Bonus - v. 1.0

Mhm. My?l?, ?e da rade.
 

zygzagZ

Advanced User
Joined
Aug 14, 2008
Messages
281
Reaction score
34
Odp: Party Loot Bonus - v. 1.0

Co do corpse - zak?adam, ?e u?ytkownicy skryptu wiedz?, czy potworek ma corpse, czy te? nie. Og??em problem z containerem znam, ale ma?o czasu by go poprawi? - wczoraj jedynie co? mi si? uda?o napisa?, jednak to mi uciek?o.

Rozumi?, ale co to za problem :)
Osobi?cie nauczy?em si? nie ufa? ludziom. Nawet sobie te?. Lepiej zawsze wszystko sprawdzi?, ni? ?eby potem b??dy by?y :)
Zamiast
PHP:
local corpse = getTileItemById(pos, corpseid).uid
Wrzucasz
PHP:
local corpse = getTileItemById(pos, corpseid)--bez .uid
if (corpse.itemid < 99) or (not isContainer(corpse.uid)) then return true end
Tylko potem zamiast corpse u?ywasz corpse.uid
No nie rozumiem braku czasu na dodanie jednej linijki ;)

Co do tych procent?w, to trzeba by?oby przenie?? ca?y loot do tablicy (tylko co z action id?)
wtedy wyczy?ci? zawarto?? corpse i policzy? np 110 procent loota (zaokr?glony w d??) i po kolei doda?, ale wtedy nie by?o by action id.
Albo po prostu policzy? bez usuwania 10% i do?o?y?.
W obu wypadkach... Co, je?li dead jest ju? pe?ny?
 

Dantez

Moim sekretem jest ciasto
Joined
May 22, 2008
Messages
1,206
Reaction score
202
Odp: Party Loot Bonus - v. 1.0

@up
Code:
if not (loot) or corpseid == nil or not isItemContainer(corpseid) then return true end
W ten spos?b nie wykona si? dalsza cz???. My?l?, ?e korzystniejsze.

Wczoraj przebudowa?em funkcj? createLootMessage i poprawi?em kilka rzeczy. Teraz dodaje wszystkie przedmioty z tablicy (je?li mamy tyle graczy oczywi?cie). Postaram si? dzisiaj to wrzuci?, jednak musz? to przetestowa? jeszcze i ewentualnie poprawi? :D

Z tym % lootem to mo?na wykombinowa? co? takiego, ?e zwi?ksza o 10% ilo?? item?w, kt?re si? stackuj? + 10% szansy ze wypadnie dodatkowy item. Jak corpse b?dzie pe?ny to nie doda niestety :( Trzeba si? pobawi? z dodawaniem kontener?w dodatkowych.

@top
Bd edit :)

---Aktualizacja---

Version 1.2:
  • New Roll Items option!
  • Fixed bug with empty arrays.
  • Better messages - like normal loot (magic plate armor, magic plate armor).
  • When 3 players are in the same party you earn loot for 2 players too!
  • Some other bugs repaired.
 

zygzagZ

Advanced User
Joined
Aug 14, 2008
Messages
281
Reaction score
34
Odp: Party Loot Bonus - v. 1.0

@up
Code:
if not (loot) or corpseid == nil or not isItemContainer(corpseid) then return true end
W ten spos?b nie wykona si? dalsza cz???. My?l?, ?e korzystniejsze.

Ehh. Tak, tylko ?e zapominasz, ?e je?li s? lagi na otsie to funkcja onKill mo?e si? wykona? przed stworzeniem deada. Sprawdzaj te? wynik. Wiem co m?wi?, bo kiedy? tak mia?em. Funkcja w onKill, sprawdzanie deada i czasami deada nie by?o. Poza tym, cienko jest, gdy s? dwa cia?a o danym id na tej samej kratce.

Poza tym... Jak dzia?a ten roll? Naprawd? nie chce mi si? my?le? o tej godzinie ;p
 

Dantez

Moim sekretem jest ciasto
Joined
May 22, 2008
Messages
1,206
Reaction score
202
Odp: Party Loot Bonus - v. 1.0

@up
Hmm, very good point. Naprawie.

Roll losuje dla ka?dego gracza liczb?, a potem sprawdza, kt?ra jest najwi?ksza i zapisuje jej indeks. Potem po indeksie pobiera gracza i daje mu przedmiot.
 
Status
Not open for further replies.
Top