131 lines
5.6 KiB
Python
131 lines
5.6 KiB
Python
|
collarHost = "192.168.1.47" # Note that headset packets require a response from server, but collar packets are just sent out
|
||
|
collarPort = 4120
|
||
|
from time import sleep
|
||
|
import socket
|
||
|
from simpleLog import log
|
||
|
import subprocess
|
||
|
|
||
|
# logPath = '/home/jamesh/.local/share/PolyMC/instances/Other 1.20.4/.minecraft/logs/latest.log'
|
||
|
logPath = '/home/jamesh/.local/share/PolyMC/instances/1.20.4/.minecraft/logs/latest.log'
|
||
|
lastLine = ""
|
||
|
currentHealthP1 = 0 # TODO: A better solution than this
|
||
|
previousHealthP1 = 20 # Assume full health on load
|
||
|
currentHealthP2 = 0
|
||
|
previousHealthP2 = 20
|
||
|
|
||
|
lowHealth = False # Custom rules for maps that change the health the player has. Detects when the health goes from 20 to another arbitrary value.
|
||
|
lowHealthLevel = "20" # Level of punishment delivered when player death is detected in lowHealth mode
|
||
|
|
||
|
lowHealthTrigger = 14 # Triggers punishment when this much damage is taken, so if set to 14, 20 to 6 will trigger.
|
||
|
|
||
|
p1 = "timothyhay"
|
||
|
p2 = "snoopyhoff"
|
||
|
|
||
|
players = 2 # How many players to use. p1 uses channel 1 by default.
|
||
|
|
||
|
channel = "1"
|
||
|
mode = "4" # 1: LED, 2: BEEP, 3: VIBRATE, 4: ZAP
|
||
|
|
||
|
shockMultiplier = 5
|
||
|
|
||
|
block = False # If set to true, no commands will be sent. Used for lowHealth
|
||
|
if mode == "4":
|
||
|
log("WARNING -- You are running with shocks ENABLED! -- WARNING", "w")
|
||
|
log("WARNING -- With a multiplier of "+str(shockMultiplier)+", the max shock level is "+str(shockMultiplier*20)+"! -- WARNING", "w")
|
||
|
|
||
|
def getLastLine(filePath):
|
||
|
with open(filePath, 'r') as file:
|
||
|
lines = file.readlines()
|
||
|
lastLine = lines[-1].strip() # remove newline character
|
||
|
return lastLine
|
||
|
|
||
|
def sendCollar(host, port, command):
|
||
|
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||
|
sock.sendto(command.encode(), (host, port))
|
||
|
|
||
|
def pairCollar(): # Call me before the loop to pair collars
|
||
|
while True:
|
||
|
chan = input("CHANNEL (q to quit): ")
|
||
|
if chan == "q":
|
||
|
exit()
|
||
|
elif chan == "1":
|
||
|
log("Sending channel 1")
|
||
|
sendCollar(collarHost, collarPort, "1350")
|
||
|
elif chan == "2":
|
||
|
log("Sending channel 2")
|
||
|
sendCollar(collarHost, collarPort, "2350")
|
||
|
else:
|
||
|
log("Sending input as raw!")
|
||
|
sendCollar(collarHost, collarPort, str(chan))
|
||
|
|
||
|
# pairCollar()
|
||
|
|
||
|
log("I will monitor the Minecraft logfile located at "+logPath+" and fire packets at "+collarHost+":"+str(collarPort))
|
||
|
while True:
|
||
|
# sleep(.1)
|
||
|
# currentLine = getLastLine(logPath)
|
||
|
currentLine = str((subprocess.check_output(['tail', '-1', logPath])).decode('utf-8')[0:-1])
|
||
|
# if lastLine != currentLine:
|
||
|
if "~" in currentLine:
|
||
|
line = currentLine.split("~")
|
||
|
# log(line[1]) # Player name
|
||
|
# log(line[3]) # Player health
|
||
|
if line[1] == p1:
|
||
|
# log("fsd")
|
||
|
# log(currentHealthP1)
|
||
|
# log(previousHealthP1)
|
||
|
currentHealthP1 = line[3]
|
||
|
if currentHealthP1 != previousHealthP1:
|
||
|
damage = (int(currentHealthP1) - int(previousHealthP1))*-1
|
||
|
log(line[1]+" health: "+currentHealthP1)
|
||
|
if damage > 0:
|
||
|
log(line[1]+" damage: "+str(damage))
|
||
|
level = str(int(damage*shockMultiplier))
|
||
|
if 0 < int(level) <= 100:
|
||
|
if damage == lowHealthTrigger and lowHealth:
|
||
|
log(line[1]+" gets a level "+lowHealthLevel+" shock on channel 1.", "w")
|
||
|
sendCollar(collarHost, collarPort, "1"+mode+lowHealthLevel)
|
||
|
block = True
|
||
|
else:
|
||
|
block = False
|
||
|
if not block and not lowHealth:
|
||
|
log(line[1]+" gets a level "+level+" shock on channel 1.", "w")
|
||
|
sendCollar(collarHost, collarPort, "1"+mode+level)
|
||
|
elif line[1] == p2:
|
||
|
currentHealthP2 = line[3]
|
||
|
if currentHealthP2 != previousHealthP2:
|
||
|
damage = (int(currentHealthP2) - int(previousHealthP2))*-1
|
||
|
log(line[1]+" health: "+currentHealthP2)
|
||
|
if damage > 0:
|
||
|
log(line[1]+" damage: "+str(damage))
|
||
|
level = str(int(damage*shockMultiplier))
|
||
|
if 0 < int(level) <= 100:
|
||
|
if damage == lowHealthTrigger and lowHealth:
|
||
|
print("fds")
|
||
|
log(line[1]+" gets a level "+lowHealthLevel+" shock on channel 2.", "w")
|
||
|
sendCollar(collarHost, collarPort, "2"+mode+lowHealthLevel)
|
||
|
block = True
|
||
|
else:
|
||
|
block = False
|
||
|
if not block and not lowHealth:
|
||
|
print("asfed")
|
||
|
log(line[1]+" gets a level "+level+" shock on channel 2.", "w")
|
||
|
sendCollar(collarHost, collarPort, "2"+mode+level)
|
||
|
# currentHealth = int(currentLine.split("~")[1])
|
||
|
# damage = (currentHealth - previousHealth)*-1 # Get actual damage
|
||
|
# if currentHealth != previousHealth:
|
||
|
# log("Health: "+str(currentHealth))
|
||
|
# if damage > 0:
|
||
|
# log("Damage: "+str(damage)+" damage.")
|
||
|
# level = str(int(damage*shockMultiplier))
|
||
|
# if 0 < int(level) <= 100:
|
||
|
# log("Player gets a level "+level+" shock.")
|
||
|
# sendCollar(collarHost, collarPort, channel+mode+level)
|
||
|
|
||
|
else:
|
||
|
# log(currentLine)
|
||
|
pass
|
||
|
lastLine = currentLine
|
||
|
previousHealthP1 = currentHealthP1
|
||
|
previousHealthP2 = currentHealthP2
|