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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
from helpers import *
from java.util.UUID import fromString as idToPlayer
forcefield_permissions = ["utils.forcefield", "utils.forcefield.ignore"]
forcefield_prefix = "&8[&aFF&8]"
fd = 4 # forcefield distance
forcefield_toggle = []
forcefield_whitelist = {}
@hook.command("forcefield")
def onForceFieldCommand(sender, args):
if not isPlayer(sender) or not sender.hasPermission(forcefield_permissions[0]):
noperm(sender)
return True
sender_id = str(sender.getUniqueId())
if not args or args[0].lower() == "toggle": #Toggle
toggle_forcefield(sender, sender_id)
elif args[0].lower() in ["whitelist", "wl", "wlist"]: #Whitelist commands
if not args[1:] or args[1].lower() == "list":
whitelist_list(sender, sender_id)
elif args[1].lower() == "clear":
whitelist_clear(sender, sender_id)
elif args[1].lower() in ["add", "+"]:
whitelist_add(sender, sender_id, True, args[2:])
elif args[1].lower() in ["remove", "delete", "rem", "del", "-"]:
whitelist_add(sender, sender_id, False, args[2:])
else:
invalid_syntax(sender)
elif args[0].lower() in ["help", "?"]: #/forcefield help
forcefield_help(sender)
else:
invalid_syntax(sender)
return True
def whitelist_add(sender, sender_id, add, players):
if not players:
msg(sender, "%s &cGive space-separated playernames." % forcefield_prefix)
elif add == True and sender_id not in forcefield_whitelist:
forcefield_whitelist[sender_id] = []
online_players = []
for name in list(server.getOnlinePlayers()):
online_players.append(str(name).lower())
for name in players:
online = False
player = server.getPlayer(name) if name.lower() in online_players else server.getOfflinePlayer(name)
if name.lower() in online_players:
online = True
if not player == "null":
uid = str(player.getUniqueId())
pname = player.getDisplayName()
if add == True and uid not in forcefield_whitelist[sender_id]:
if player == sender:
msg(sender, "%s &cYou can't whitelist yourself." % forcefield_prefix)
else:
forcefield_whitelist[sender_id].append(uid)
msg(sender, "%s &aAdded %s to your forcefield whitelist." % (forcefield_prefix, pname))
if online == True:
msg(player, "%s %s &aAdded you to his forcefield whitelist." % (forcefield_prefix, sender.getDisplayName()))
elif add == False and uid in forcefield_whitelist[sender_id]:
forcefield_whitelist[sender_id].remove(uid)
msg(sender, "%s &cRemoved %s from your forcefield whitelist." % (forcefield_prefix, pname))
if online == True:
msg(player, "%s %s &cRemoved you from his forcefield whitelist." % (forcefield_prefix, sender.getDisplayName()))
elif add == True:
msg(sender, "%s &c%s &cWas already in your forcefield whitelist." % (forcefield_prefix, pname))
else:
msg(sender, "%s &c%s &cWas not in your forcefield whitelist." % (forcefield_prefix, pname))
else:
msg(sender, "%s &cplayer %s &cwas not found." % (forcefield_prefix, name))
def whitelist_list(sender, sender_id):
msg(sender, "%s &aForceField Whitelist:" % forcefield_prefix)
if not sender_id in forcefield_whitelist or len(forcefield_whitelist[sender_id]) == 0:
msg(sender, "&c Your whitelist has no entries.")
else:
c=0
for uid in forcefield_whitelist[sender_id]:
c+=1
msg(sender, "&a %s. &f%s" % (c, server.getPlayer(idToPlayer(uid)).getDisplayName()))
def whitelist_clear(sender, sender_id):
if len(forcefield_whitelist[sender_id]) == 0:
msg(sender, "%s &cYou had no players whitelisted." % forcefield_prefix)
else:
forcefield_whitelist[sender_id] = []
msg(sender, "%s &aForceField Whitelist cleared." % forcefield_prefix)
def forcefield_help(sender):
msg(sender, "%s &a&l/ForceField Help: \n&aYou can use the forcefield to keep players on distance." % forcefield_prefix)
msg(sender, "&2Commands:")
msg(sender, "&a1. &6/ff &ohelp &a: aliases: ?")
msg(sender, "&a2. &6/ff &o(toggle)")
msg(sender, "&a3. &6/ff &owhitelist (list) &a: aliases: wlist, wl")
msg(sender, "&a4. &6/ff wl &oclear")
msg(sender, "&a5. &6/ff wl &oadd <players> &a: aliases: &o+")
msg(sender, "&a6. &6/ff wl &oremove <players> &a: aliases: &odelete, rem, del, -")
def toggle_forcefield(sender, sender_id):
if sender_id in forcefield_toggle:
forcefield_toggle.remove(sender_id)
msg(sender, "%s &aForceField toggle: &cOFF" % forcefield_prefix)
else:
forcefield_toggle.append(sender_id)
msg(sender, "%s &aForceField toggle: &2ON" % forcefield_prefix)
def invalid_syntax(sender):
msg(sender, "%s &cInvalid syntax. Use &o/ff ? &cfor more info." % forcefield_prefix)
#--------------------------------------------------------------------------------------------------------#
@hook.event("player.PlayerMoveEvent")
def onMove(event):
player = event.getPlayer()
player_id = str(player.getUniqueId())
if player_id in forcefield_toggle: #player has forcefield, entity should be launched
if not forcefield_whitelist[player_id]:
forcefield_whitelist[player_id] = []
for entity in player.getNearbyEntities(fd, fd, fd):
log("%s" % entity.getName())
if isPlayer(entity) and not entity.hasPermission(forcefield_permissions[1]) and not str(entity.getUniqueId()) in forcefield_whitelist[player_id] and not entity == player:
setVelocityAway(player, entity)
if not player.hasPermission(forcefield_permissions[1]): #player should be launched, entity has forcefield
for entity in player.getNearbyEntities(fd, fd, fd):
entity_id = str(entity.getUniqueId())
if not forcefield_whitelist[entity_id]:
forcefield_whitelist[entity_id] = []
if isPlayer(entity) and entity_id in forcefield_toggle and not player_id in forcefield_whitelist[entity_id] and not entity == player:
if event.getFrom().distance(entity.getLocation()) > 4:
event.setCancelled(True)
msg(player, "&cYou may not get closer than %sm to %s &cdue to their forcefield." % (fd, entity.getDisplayName()))
else:
setVelocityAway(entity, player) #Other way around
def setVelocityAway(player, entity): #Moves entity away from player
player_loc = player.getLocation()
entity_loc = entity.getLocation()
dx = entity_loc.getX() - player_loc.getX()
dy = entity_loc.getY() - player_loc.getY()
dz = entity_loc.getZ() - player_loc.getZ()
negator = fd/2
entity.setVelocity(negator/dx, negator/dy, negator/dz)
#--------------------------------------------------------------------------------------------------------#
@hook.event("player.PlayerQuitEvent")
def onQuit(event):
try:
forcefield_toggle.remove(str(event.getPlayer().getUniqueId()))
except:
pass
|