English Monster spawn

No replies
Goto Page
To the start Previous 1 Next To the start
16.07.20 04:01:44 am
Up
pbeloto
User
Offline Off
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.

Code:
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