В настоящее время я работаю над выпущенным ботом для игры в надежде узнать больше о программировании. К сожалению, новая команда, которую я добавил, которая на первый взгляд казалась простой, стала чрезвычайно сложной, когда я попал в тему двоичных массивов. По сути, я взял уже сделанную команду, в которой вы размещаете элемент в двух местах, чтобы определить область, в которой вы будете восстанавливать. Моя редакция команды будет состоять в том, что она позволит полностью восстановить всю карту без размещения каких-либо элементов для определения карты.
Перед выполнением команды восстановления выполняется команда резервного копирования, в которой двоичный массив создается из всей карты и затем сохраняется в файле. Чтобы восстановить всю карту, новая команда все еще должна иметь дело с координатами двух точек. Один будет в нижнем углу карты (0,0,0), а затем другой в углу в верхней противоположной стороне карты, который всегда будет варьироваться в зависимости от того, какой сервер вы хотите. Моим аргументом для решения этой проблемы было бы просто получить длину двоичного массива для каждой координаты. К сожалению, мне не повезло, пытаясь это сделать, и я действительно не знаю, как найти размеры двоичного массива. Упаковка и распаковка массива показаны и часть кода, которую я не могу решить.
Одна странная вещь заключается в том, что если я ввожу числа вручную, например, оператор if с этим IP-адресом одного сервера, бот работает отлично. Просто любая попытка создать код, который работал бы для любой карты, а не только для одной карты, оказалась бесплодной.
enter code here
def onBackup(self,user,filename):
fn = bakFolder+filename+".backup"
try:
f = open(fn,"r")
self.bot.sendMessage("A backup by that name already exists.")
f.close()
return
except IOError:
try:
f = open(fn,"wb")
f.write(struct.pack("!3i",self.bot.level_x,self.bot.level_y,self.bot.level_z))
self.bot.block_array.tofile(f)
self.bot.sendMessage("Backup saved to file %s.backup"%filename)
print "Backup save to %s.backup"%filename
return
except IOError:
self.bot.sendMessage("Error opening %s.backup"%filename, false)
print "Backup: Error opening file"
return
def restoremap(self):
fn = bakFolder+self.restore_filename+".backup"
try:
f = open(fn,"rb")
header_x, header_y, header_z = struct.unpack('!3i',f.read(12))
backup_array = array.array('B')
backup_array.fromfile(f,header_x*header_y*header_z)
x1,y1,z1 = (0,0,0)
if server == "204.232.197.228":
x2,y2,z2 = (64,1020,64) #special server that already has coordinates
else:
x2,y2,z2 = ??? rest of servers, coordinates derived from the binary array
if x1 > x2 : x1, x2 = x2, x1
if y1 > y2 : y1, y2 = y2, y1
if z1 > z2 : z1, z2 = z2, z1
tiles_to_deglass = []
tiles_to_build = []
while x1 <= x2:
y = y1
while y <= y2:
z = z1
while z <= z2:
offset = self.bot.calculateOffset(x1,y,z)
current_tile = int(self.bot.block_array[offset])
backup_tile = int(backup_array[offset])
if not ( current_tile == backup_tile):
if (current_tile == 0) and (backup_tile in self.valid_blocks):
tiles_to_build.append((backup_tile,x1,y,z))
elif (current_tile >= 8) and (current_tile <= 11) and (backup_tile == 0):
## This deals with water & lava in what used to be empty spaces
## first we'll glass it all, and then deglass later!
self.blocks.append((20,x1,y,z))
tiles_to_deglass.append((0,x1,y,z))
elif backup_tile == 7:##use stone
tiles_to_build.append((0,x1,y,z))
tiles_to_build.append((1,x1,y,z))
elif backup_tile in self.valid_blocks:
## This is the fall through... We'll try to erase
## the current tile and then restore it to the other state
tiles_to_build.append((0,x1,y,z))
tiles_to_build.append((backup_tile,x1,y,z))
elif (backup_tile == 0) and not (current_tile == 0):
tiles_to_build.append((0,x1,y,z))
z+=1
y += 1
x1 +=1
self.DrawBlocks()
self.blocks += tiles_to_build
self.DrawBlocks()
self.blocks += tiles_to_deglass
self.DrawBlocks()
self.bot.sendMessage("Restoring...",ignorable=True)
##self.bot.action_queue.append(SayAction(self.bot,"Done restoring."))
self.onReset(silent=True)
except IOError:
self.bot.sendMessage("Error while restoring (couldn't read file).")