What's new

-Skrypt Zoombi event!

Status
Not open for further replies.

Sepox

Active User
Joined
Mar 16, 2017
Messages
138
Reaction score
0
Witam poszukuje tak jak w temacie Zoombi Event! w 100% opisany krok po kroku [PL] bo jest kilka w necie ale nie wiem co i jak ustawia? , pom?g?by kto?? leci REP
 

DenZ

Zasłużony
Joined
Feb 23, 2011
Messages
868
Reaction score
30
Age
28
Odp: Zoombi event!

Code:
<?xml version="1.0" encoding="UTF-8"?>
<mod name="Zombie_Event" version="3.0" author="VirrageS" contact="otland.net" enabled="yes">

	<config name="config_zombie_event">
		<![CDATA[
			configZombieEvent = {
				storages = {
					main = 'zombieEventMain', -- set free storage
					player = 'zombieEventPlayer', -- set free storage
					joining = 'zombieEventJoining', -- set free storage
					kills = 'zombieEventKills', -- set free storage
					exhaust = 'zombieEventExhaust', -- set free storage
					countEvent = 'zombieEventCountEvent' -- set free storage
				},
				
				position = {x=981,y=1010,z=15}, -- position to which player is teleporting 
				room = {
					from = {x=922,y=972,z=15}, -- left top corner of event room
					to = {x=962,y=1022,z=15} -- right bottom corner of event room
				},				
				
				rewards = {2160, 2322, 9969, 7697, 2354}, -- reward id which player can win (reward is random)				
				players = {
					max = 15, -- max players in event
					min = 5, -- min players to event start
					minLevel = 500, -- min level to join to event
					pvpEnabled = false -- can players hit theirselfs
				},
				
				days = {
					['Tuesday'] = {'20:59:20'}, 
					['Thursday'] = {'20:59:20'}, 
					['Friday'] = {'20:59:20'}, 
					['Sunday'] = {'20:59:20'}
				},
				
				spawnDelay = 2000, -- miliseconds
				amountCreatingMonsters = 5,
				monsters = {'Scratchclaw', 'Propell Zombie', 'Vile Centurion', 'Mongrel Man', 'Daidalost'}, -- name of monsters which is creating in event

				delayTime = 5.0, -- time in which players who joined to event are teleporting to teleport position [miuntes]
				startEvent = 1, -- time from teleport to start event [seconds]
				stopEvent = 9200, -- [seconds]
				text = '-PL-\nAby wygrac i otrzymac nagrode, zabij jak najwieksza liczbe zombie przez 20min lub pozostan sam na arenie.\n\n-ENG-\nTo win and get a reward, kill as many zombies for 20 minutes or stay the same in the arena.'
			}
		]]>
	</config>
	
	<lib name="lib_zombie_event">
		<![CDATA[
			function doStopZombieEvent()
				if getStorage(configZombieEvent.storages.main) > 0 then
					local playerTable, creatureTable = {}, {}

					for x = configZombieEvent.room.from.x, configZombieEvent.room.to.x do
						for y = configZombieEvent.room.from.y, configZombieEvent.room.to.y do
							local n, i = getTileInfo({x=x, y=y, z=configZombieEvent.room.from.z}).creatures, 1
							if n ~= 0 then
								local v = getThingfromPos({x=x, y=y, z=configZombieEvent.room.from.z, stackpos=i}).uid
								while v ~= 0 do
									if isPlayer(v) then
										table.insert(playerTable, v)
										if n == #playerTable then
											break
										end
									elseif isMonster(v) then
										table.insert(creatureTable, v)
										if n == #creatureTable then
											break
										end
									end
									i = i + 1
									v = getThingfromPos({x=x, y=y, z=configZombieEvent.room.from.z, stackpos=i}).uid
								end
							end
						end
					end

					if #playerTable > 1 then
						table.sort(playerTable, function(a, b) return (getCreatureStorage(a, configZombieEvent.storages.kills)) > (getCreatureStorage(b, configZombieEvent.storages.kills)) end)
						
						local prize = math.random(#configZombieEvent.rewards)
						
						doTeleportThing(playerTable[1], getTownTemplePosition(getPlayerTown(playerTable[1])))
						doCreatureSetStorage(playerTable[1], configZombieEvent.storages.kills, 0)
						doPlayerAddItem(playerTable[1], configZombieEvent.rewards[prize], 1)
						doCreatureAddHealth(playerTable[1], getCreatureMaxHealth(playerTable[1]) - getCreatureHealth(playerTable[1]))
						doCreatureAddMana(playerTable[1], getCreatureMaxMana(playerTable[1]) - getCreatureMana(playerTable[1]))
						doPlayerSendTextMessage(playerTable[1], MESSAGE_EVENT_ADVANCE, 'You win! You have received '..getItemNameById(configZombieEvent.rewards[prize])..' as reward.')
						doBroadcastMessage('Zombie Plague Attack has finished. The winner is '..getCreatureName(playerTable[1])..'. Congratulations!')
						doSetStorage(configZombieEvent.storages.main, -1)
						
						db.query("INSERT INTO `events` (`event_name`, `winner_name`, `won_item`, `time_win`) VALUES (\"Zombie\", \"" .. getCreatureName(playerTable[1]) .. "\", \"" .. getItemNameById(configZombieEvent.rewards[prize]) .. "\", " .. getStorage(configZombieEvent.storages.countEvent) ..");")

						for i = 2, #playerTable do
							doCreatureAddHealth(playerTable[i], getCreatureMaxHealth(playerTable[i]) - getCreatureHealth(playerTable[i]))
							doCreatureAddMana(playerTable[i], getCreatureMaxMana(playerTable[i]) - getCreatureMana(playerTable[i]))
							doTeleportThing(playerTable[i], getTownTemplePosition(getPlayerTown(playerTable[i])))
							doPlayerSendTextMessage(playerTable[i], MESSAGE_EVENT_ADVANCE, 'You loss.')
							doSendMagicEffect(getThingPos(playerTable[i]), CONST_ME_STUN)
							doCreatureSetStorage(playerTable[i], configZombieEvent.storages.kills, 0)
						end

						for i = 1, #creatureTable do
							if isMonster(creatureTable[i]) then
								doRemoveCreature(creatureTable[i])
							end
						end
						
						doSetStorage(configZombieEvent.storages.countEvent, getStorage(configZombieEvent.storages.countEvent) + 1)
					elseif #playerTable == 0 then
						for i = 1, #creatureTable do
							if isMonster(creatureTable[i]) then
								doRemoveCreature(creatureTable[i])
							end
						end
					
						doBroadcastMessage('No one win in Zombie Plague Attack.')
						doSetStorage(configZombieEvent.storages.main, -1)
						doSetStorage(configZombieEvent.storages.countEvent, getStorage(configZombieEvent.storages.countEvent) + 1)
					end
				end
			end

			function doStartZombieEvent()
				doSetStorage(configZombieEvent.storages.joining, -1)

				if configZombieEvent.players.min <= doCountPlayersZombieEvent() then
					for _, cid in ipairs(getPlayersOnline()) do
						if getCreatureStorage(cid, configZombieEvent.storages.player) > 0 then
							doCreatureSetStorage(cid, configZombieEvent.storages.player, -1)
							doTeleportThing(cid, configZombieEvent.position)
							doCreatureSetNoMove(cid, false)
							doRemoveCondition(cid, CONDITION_INFIGHT)
							
							doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, 'Get ready. Zombie Plague Attack starts in '..configZombieEvent.startEvent..' seconds.')
						end
					end
					
					addEvent(doSetStorage, configZombieEvent.startEvent * 1000, configZombieEvent.storages.main, 1)
					addEvent(doStopZombieEvent, configZombieEvent.stopEvent * 1000)
					addEvent(doRepeatCheckZombieEvent, configZombieEvent.startEvent * 1000 + 2000)
					
					doBroadcastMessage('Zombie Plague Attack has started. LET\'S GO!')
				else
					for _, cid in ipairs(getPlayersOnline()) do
						if getCreatureStorage(cid, configZombieEvent.storages.player) > 0 then
							doCreatureSetNoMove(cid, false)
							doRemoveCondition(cid, CONDITION_INFIGHT)
						end
					end
					
					doBroadcastMessage('Zombie Plague Attack hasn\'t started beacuse there were not enough players.')
				end
			end
			
			function doRepeatCheckZombieEvent()
				if getStorage(configZombieEvent.storages.main) > 0 then
					local playerTable, creatureTable, xTable, yTable = {}, {}, {}, {}

					for x = configZombieEvent.room.from.x, configZombieEvent.room.to.x do
						for y = configZombieEvent.room.from.y, configZombieEvent.room.to.y do
							local n, i = getTileInfo({x=x, y=y, z=configZombieEvent.room.to.z}).creatures, 1
							if n ~= 0 then
								local v = getThingfromPos({x=x, y=y, z=configZombieEvent.room.to.z, stackpos=i}).uid
								while v ~= 0 do
									if isPlayer(v) then
										table.insert(playerTable, v)
										if n == #playerTable then
											break
										end
									elseif isMonster(v) then
										table.insert(creatureTable, v)
										if n == #creatureTable then
											break
										end
									end
									i = i + 1
									v = getThingfromPos({x=x, y=y, z=configZombieEvent.room.to.z, stackpos=i}).uid
								end
							end
							
							table.insert(xTable, x)
							table.insert(yTable, y)
						end
					end

					if #playerTable == 1 then
						local prize = math.random(#configZombieEvent.rewards)
						
						addEvent(doTeleportThing, 200, playerTable[1], getTownTemplePosition(getPlayerTown(playerTable[1])), true)
						doPlayerAddItem(playerTable[1], configZombieEvent.rewards[prize], 1)
						doCreatureSetStorage(playerTable[1], configZombieEvent.storages.kills, 0)
						doCreatureAddHealth(playerTable[1], getCreatureMaxHealth(playerTable[1]) - getCreatureHealth(playerTable[1]))
						doCreatureAddMana(playerTable[1], getCreatureMaxMana(playerTable[1]) - getCreatureMana(playerTable[1]))
						doPlayerSendTextMessage(playerTable[1], MESSAGE_EVENT_ADVANCE, 'You win! You have received '..getItemNameById(configZombieEvent.rewards[prize])..' as reward.')
						doBroadcastMessage('Zombie Plague Attack has finished. The winner is '..getCreatureName(playerTable[1])..'. Congratulations.')
						db.query("INSERT INTO `events` (`event_name`, `winner_name`, `won_item`, `time_win`) VALUES (\"Zombie\", \"" .. getCreatureName(playerTable[1]) .. "\", \""..getItemNameById(configZombieEvent.rewards[prize]).."\", "..getStorage(configZombieEvent.storages.countEvent)..");")
						
						for i = 1, #creatureTable do
							if isMonster(creatureTable[i]) then
								doRemoveCreature(creatureTable[i])
							end
						end
						
						doSetStorage(configZombieEvent.storages.main, -1)
						doSetStorage(configZombieEvent.storages.countEvent, getStorage(configZombieEvent.storages.countEvent) + 1)
						return
					elseif #playerTable == 0 then
						for i = 1, #creatureTable do
							if isMonster(creatureTable[i]) then
								doRemoveCreature(creatureTable[i])
							end
						end
					
						doBroadcastMessage('No one win in Zombie Plague Attack.')
						doSetStorage(configZombieEvent.storages.main, -1)
						
						doSetStorage(configZombieEvent.storages.countEvent, getStorage(configZombieEvent.storages.countEvent) + 1)
						return
					end
				
					local pos = {x=xTable[math.random(#xTable)], y=yTable[math.random(#yTable)], z=7}				
					for i = 1, configZombieEvent.amountCreatingMonsters do
						doCreateMonster(configZombieEvent.monsters[math.random(#configZombieEvent.monsters)], pos, false, false, false)
						doSendMagicEffect(pos, CONST_ME_BATS)
					end
					
					addEvent(doRepeatCheckZombieEvent, configZombieEvent.spawnDelay)
				end
			end
			
			function doCountPlayersZombieEvent()
				local x = 0
				for _, cid in ipairs(getPlayersOnline()) do
					if getCreatureStorage(cid, configZombieEvent.storages.player) > 0 then
						x = x + 1
					end
				end
				return x
			end
			
			function doStartCountingZombieEvent(x)
				if configZombieEvent.delayTime-x > 0 then
					doBroadcastMessage('Zombie Plague Attack is going to start in '..configZombieEvent.delayTime-x..' minutes. You can join to the event by saying "!zombie join".')
					addEvent(doStartCountingZombieEvent, 60*1000, x+1)
				end
			end
		]]>
	</lib>

	<talkaction words="!zombie" event="script">
		<![CDATA[
			domodlib("config_zombie_event")

			function onSay(cid, words, param)
				if getStorage(configZombieEvent.storages.joining) ~= 1 then
					return doPlayerSendCancel(cid, 'Zombie Plague Attack hasn\'t started yet.')
				elseif param == '' then
					return doPlayerSendCancel(cid, 'Command param required (say: "!zombie join" or "!zombie leave.").')
				elseif getPlayerLevel(cid) < configZombieEvent.players.minLevel then
					return doPlayerSendCancel(cid, 'You can\'t join to the event if you don\'t have a require '..configZombieEvent.players.minLevel..' level.')
				elseif getTileInfo(getThingPos(cid)).protection ~= true then
					return doPlayerSendCancel(cid, 'You can\'t join to the event if you aren\'t in protection zone.')
				elseif exhaustion.check(cid, configZombieEvent.storages.exhaust) ~= false then
					return doPlayerSendCancel(cid, 'You must wait '..exhaustion.get(cid, configZombieEvent.storages.exhaust)..' seconds to use this command again.')
				end

				if param == 'join' then
					if getCreatureStorage(cid, configZombieEvent.storages.player) > 0 then
						return doPlayerSendCancel(cid, 'You have arleady joined to event. Wait patiently for start.')
					elseif doCountPlayersZombieEvent() == configZombieEvent.players.max then
						return doPlayerSendCancel(cid, 'Max players in the event have been reached.')
					end
					
					doCreatureSetNoMove(cid, true)
					doPlayerPopupFYI(cid, configZombieEvent.text)
					doCreatureSetStorage(cid, configZombieEvent.storages.player, 1)
					doAddCondition(cid, createConditionObject(CONDITION_INFIGHT, -1))
					doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, 'You have joined to Zombie Plague Attack. You can\'t move until event don\'t start. Wait patiently for the event start.')
					doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You have joined to Zombie Plague Attack.')
				elseif param == 'leave' then
					if getCreatureStorage(cid, configZombieEvent.storages.player) <= 0 then
						return doPlayerSendCancel(cid, 'You can\'t leave from the event if you don\'t join.')
					end
					
					doCreatureSetNoMove(cid, false)
					doCreatureSetStorage(cid, configZombieEvent.storages.player, -1)
					doRemoveCondition(cid, CONDITION_INFIGHT)
					doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You have left from the Zombie Plague Attack.')
				end
				
				exhaustion.set(cid, configZombieEvent.storages.exhaust, 5)				
				return true
			end
		]]>
	</talkaction>
	
	<talkaction words="!startzombie" access="5" event="script">
		<![CDATA[
			domodlib("config_zombie_event")
			domodlib("lib_zombie_event")

			function onSay(cid, words, param)
				if getStorage(configZombieEvent.storages.main) > 0 then
					return doPlayerSendCancel(cid, 'Zombie Plague Attack is already running.')
				end
			
				doStartCountingZombieEvent(0)

				for _, pid in ipairs(getPlayersOnline()) do
					if getCreatureStorage(pid, configZombieEvent.storages.player) > 0 then
						doCreatureSetStorage(pid, configZombieEvent.storages.player, -1)
						doTeleportThing(pid, getTownTemplePosition(getPlayerTown(pid)), true)
						doCreatureSetStorage(pid, configZombieEvent.storages.kills, 0)
					end
				end

				doSetStorage(configZombieEvent.storages.joining, 1)
				addEvent(doStartZombieEvent, configZombieEvent.delayTime * 60 * 1000)
				return true
			end
		]]>
	</talkaction>
	
	<talkaction words="!stopzombie" access="5" event="script">
		<![CDATA[
			domodlib("config_zombie_event")
			domodlib("lib_zombie_event")

			function onSay(cid, words, param)
				if getStorage(configZombieEvent.storages.main) > 0 then
					doStopZombieEvent()
				else
					doPlayerSendCancel(cid, 'You can not do it if Zombie Plague Attack is not enabled.')
				end
				return true
			end
		]]>
	</talkaction>

	<globalevent name="Zombie_Event_Days" interval="1000" event="script">
		<![CDATA[
			domodlib("config_zombie_event")
			domodlib("lib_zombie_event")
			
			local daysOpen = {}			
			for k, v in pairs(configZombieEvent.days) do
				table.insert(daysOpen, k)
			end
			
			function onThink(interval)
				if isInArray(daysOpen, os.date('%A')) then
					if isInArray(configZombieEvent.days[os.date('%A')], os.date('%X', os.time())) then
						if getStorage(configZombieEvent.storages.joining) ~= 1 then
							doStartCountingZombieEvent(0)

							for _, pid in ipairs(getPlayersOnline()) do
								if getCreatureStorage(pid, configZombieEvent.storages.player) > 0 then
									doCreatureSetStorage(pid, configZombieEvent.storages.player, -1)
									doTeleportThing(pid, getTownTemplePosition(getPlayerTown(pid)), true)
									doCreatureSetStorage(pid, configZombieEvent.storages.kills, 0)
								end
							end

							doSetStorage(configZombieEvent.storages.joining, 1)
							addEvent(doStartZombieEvent, configZombieEvent.delayTime * 60 * 1000)
						end
					end
				end
				return true
			end
		]]>
	</globalevent>
	
	<event type="statschange" name="Zombie_Event_Dead" event="script">
		<![CDATA[
			domodlib("config_zombie_event")

			function onStatsChange(cid, attacker, type, combat, value)
				if type == 1 and getCreatureHealth(cid) <= value then
					if isInRange(getThingPos(cid), configZombieEvent.room.from, configZombieEvent.room.to) then
						if isPlayer(cid) then
							doCreatureAddHealth(cid, getCreatureMaxHealth(cid) - getCreatureHealth(cid))
							doCreatureAddMana(cid, getCreatureMaxMana(cid) - getCreatureMana(cid))
							doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
							doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You loss due to attack.')
							
							doSendAnimatedText(getThingPos(cid), value, TEXTCOLOR_RED)
							doSendMagicEffect(getThingPos(cid), CONST_ME_TELEPORT)
							doCreatureSetStorage(cid, configZombieEvent.storages.kills, 0)
							return false
						end
					end
				elseif configZombieEvent.players.pvpEnabled ~= true and isInArray({1,3}, type) and isPlayer(attacker) and isPlayer(cid) then
					if isInRange(getThingPos(cid), configZombieEvent.room.from, configZombieEvent.room.to) then
						return false
					end
				end
				return true
			end
		]]>
	</event>

	<event type="kill" name="Zombie_Event_Kill" event="script">
		<![CDATA[
			domodlib("config_zombie_event")

			function onKill(cid, target, damage, flags)
				if isInRange(getThingPos(cid), configZombieEvent.room.from, configZombieEvent.room.to) then
					if isInArray(configZombieEvent.monsters, getCreatureName(target)) then
						doCreatureSetStorage(cid, configZombieEvent.storages.kills, math.max(0, getCreatureStorage(cid, configZombieEvent.storages.kills) + 1))
					end
				end
				return true
			end
		]]>
	</event>

	<event type="login" name="Zombie_Event_Login" event="script">
		<![CDATA[
			domodlib("config_zombie_event")

			function onLogin(cid)
				if getCreatureStorage(cid, configZombieEvent.storages.player) > 0 then
					doCreatureSetStorage(cid, configZombieEvent.storages.player, -1)
					doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), true)
					doCreatureSetNoMove(cid, false)
					doRemoveCondition(cid, CONDITION_INFIGHT)
					doCreatureSetStorage(cid, configZombieEvent.storages.player.kills, 0)
				end

				registerCreatureEvent(cid, 'Zombie_Event_Dead')
				registerCreatureEvent(cid, 'Zombie_Event_Kill')
				return true
			end
		]]>
	</event>
	
	<globalevent name="Zombie_Event_Start" type="startup" event="script">
		<![CDATA[
			domodlib("config_zombie_event")

			function onStartup()
				doSetStorage(configZombieEvent.storages.main, -1)
				doSetStorage(configZombieEvent.storages.joining, -1)
				return true
			end
		]]>
	</globalevent>
</mod>
 
Status
Not open for further replies.
Top