summaryrefslogtreecommitdiff
path: root/spawnplayer.py
blob: 39113f82c3dfc42ce0da5ed281980e8ad4c985f7 (plain)
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
"""
Code that was used once to create this awesome screenshot
- https://i.imgur.com/v4wg5kl.png
- https://i.imgur.com/tIZ3jmC.png
- https://www.reddit.com/r/Minecraft/comments/28le52/screenshot_of_all_players_that_joined_my_server/
"""
import net.minecraft.server.v1_7_R1.EntityPlayer as EntityPlayer
import net.minecraft.server.v1_7_R1.PacketPlayOutNamedEntitySpawn as PacketPlayOutNamedEntitySpawn
import net.minecraft.server.v1_7_R1.PlayerInteractManager as PlayerInteractManager
import net.minecraft.util.com.mojang.authlib.GameProfile as GameProfile
import org.bukkit.Bukkit as bukkit


# players.txt contains 1 name per line
players = [line.strip() for line in open("players.txt").readlines()]

ground = 70    # sea level
shift  = 1.625 # amount of blocks to add on each side per row (this is for FOV 90)
amount = 6     # amount of players in first row
margin = 1     # space between players
row    = 1     # distance to first row of players
goup   = 6     # after how many rows should we go up by one?
upmul  = 0.95  # multiplicate with goup each row


def spawn(dispname, sender, x, y, z):
    """
    Sends the actual player to sender
    """
    server  = bukkit.getServer().getServer()
    world   = server.getWorldServer(0)                      # main world
    profile = GameProfile(dispname, dispname)               # set player details
    manager = PlayerInteractManager(world)
    entity  = EntityPlayer(server, world, profile, manager) # create Player's entity
    entity.setPosition(x, y, z)
    packet  = PacketPlayOutNamedEntitySpawn(entity)         # create packet for entity spawn
    sender.getHandle().playerConnection.sendPacket(packet)  # send packet


@hook.command("spawnplayer")
def on_spawnplayer_command(sender, command, label, args):
    global amount, row, ground, goup

    # X and Z position
    xpos = sender.getLocation().add(-float(row-1 * shift + (amount * margin) / 2), 0, 0).getX()
    row  = sender.getLocation().add(0, 0, -row).getZ()

    count = 0
    stop  = False
    while not stop:
        for i in range(amount):
            player = players[count]
            x = int(xpos + i*margin)
            spawn(player, sender, x, ground, row)
            print(player, x, ground, row)
            count += 1
            if count >= len(players):
                stop = True
                print "breaking"
                break
        print("next row")
        row -= 1                      # next row (-z)
        xpos -= shift                 # shift left
        amount += int(shift*margin*2) # add players left and right
        if abs(row) % int(goup) == 0:
            goup   *= upmul
            ground += 1
            print "Going up by 1: %s" % ground