Forum

> > CS2D > Scripts > Monster spawn
Forums overviewCS2D overview Scripts overviewLog in to reply

English Monster spawn

No replies
To the start Previous 1 Next To the start

old Monster spawn

pbeloto
User Off Offline

Quote
good evening.

How can I make the amount of 10 monster spawne in each selected area?

Example:

10 fire golem at position 1500 (x) - 1000 (y)

10 ice golem in position 2000 (x) - 1600 (y)

10 Raptor in position 3000 (x) - 2000 (y)

I don't want each spawn to interfere with the other spawn.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
addhook("ms100", "MONSTERms100")
function MONSTERms100()
	t = t + 1
	if t % 100 == 0 then
		while #MONSTERS < CONFIG.MAXMONSTERS do
			local rand
			repeat 
			rand = math.random(#CONFIG.MONSTERS)
			until math.random(0, 100) < CONFIG.MONSTERS[rand].spawnchance
			local m = deepcopy(CONFIG.MONSTERS[rand])
			local x, y, tilex, tiley
			repeat
				if m.spawn1 then
					tilex, tiley = math.random(m.spawn1[1], m.spawn2[1]), math.random(m.spawn1[2], m.spawn2[2])
				else
					tilex, tiley = math.random(map'xsize'), math.random(map'ysize')
				end
			until not gettile(tilex, tiley).SAFE and not gettile(tilex, tiley).PVP and tile(tilex, tiley, "walkable") and tile(tilex, tiley, "frame") ~= 34
			m.x, m.y = math.floor(tilex*32+16), math.floor(tiley*32+16)
			Monster:new(m)
		end
	end
	for _, m in ipairs(MONSTERS) do
		if t % m.atkspd == 0 then
			m.target = nil
			local closest
			for _, p in ipairs(table.shuffle(player(0, 'table'))) do
				if player(p, 'health') > 0 and not gettile(PLAYERS[p].x, PLAYERS[p].y).SAFE then
					local dist = math.sqrt((player(p, 'x')-m.x)^2 + (player(p, 'y')-m.y)^2)
					if dist < 400 then
						if not closest or dist < closest[2] then
							closest = {p, dist}
						end
					end
				end
			end
			if closest then
				local dist = closest[2]
				if dist < 400 then
					m.target = closest[1]
					if m.spc and math.random(10000) <= m.spc[1] then
						m.spc[2](m, m.target, dist)
					elseif dist <= (m.range or 32) then
						m:hit(m.target, 10)
					end
				end
			end
		end
		m.imgang = math.sin(t/2.5*math.pi) * 15
		if m.target and player(m.target, 'exists') and player(m.target, 'health') > 0 and not gettile(PLAYERS[m.target].x, PLAYERS[m.target].y).SAFE then
			xdist, ydist = player(m.target, 'x') - m.x, player(m.target, 'y') - m.y
			local dist = math.sqrt(xdist^2 + ydist^2)
			if dist < 400 then
				m.ang = math.atan2(ydist, xdist)-math.pi/2+math.random(-1, 1)/2
			else
				m.target = nil
			end
		end
		if not m.target then
			m:rot(math.random(-1, 1)/2)
		end
		if not m:move(m:rot(), m.health > m.runat and 1 or -1) then
			repeat until m:move(math.rad(math.random(360)), 1)
		end
	end
	
	if MONSTERESET == 0 or requestmonstereset == 1 then
		MONSTERESET = 1
		if MINUTES%30 == 0 or requestmonstereset == 1 then
			for _, m in ipairs(MONSTERS) do
				m:restart()
				requestmonstereset = 0
			end
			msg('©100100255 MONSTER RESET @C')
		end
	end

end


function Monster:new(m)
	if not (m.x or m.y) then return false end
	m.image = image(m.image, m.x, m.y, 0)
	imagescale(m.image, m.scalex, m.scaley)
	setmetatable(m, self)
	self.__index = self
	table.insert(MONSTERS, m)
	m.id = #MONSTERS
	return m
end

TKS
To the start Previous 1 Next To the start
Log in to reply Scripts overviewCS2D overviewForums overview