Repository for mbEditorPro 2.0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

270 lines
12 KiB

# • ▌ ▄ ·. ▄▄▄▄· ▄▄▄ .·▄▄▄▄ ▪ ▄▄▄▄▄ ▄▄▄ ▄▄▄·▄▄▄
# ·██ ▐███▪▐█ ▀█▪ ▀▄.▀·██▪ ██ ██ •██ ▪ ▀▄ █· ▐█ ▄█▀▄ █·▪
# ▐█ ▌▐▌▐█·▐█▀▀█▄ ▐▀▀▪▄▐█· ▐█▌▐█· ▐█.▪ ▄█▀▄ ▐▀▀▄ ██▀·▐▀▀▄ ▄█▀▄
# ██ ██▌▐█▌██▄▪▐█ ▐█▄▄▌██. ██ ▐█▌ ▐█▌·▐█▌.▐▌▐█•█▌ ▐█▪·•▐█•█▌▐█▌.▐▌
# ▀▀ █▪▀▀▀·▀▀▀▀ ▀▀▀ ▀▀▀▀▀• ▀▀▀ ▀▀▀ ▀█▄▀▪.▀ ▀ .▀ .▀ ▀ ▀█▄▀▪
# Magicbane Emulator Project © 2013 - 2022
# www.magicbane.com
from collections import OrderedDict
from arcane.enums.hashes import hash_to_string, string_to_hash
from arcane.enums.zone.arc_prop import *
from arcane.objects.common.Inventory import Inventory
from arcane.util import ResStream
from .ArcMobile import ArcMobile
from .mobile.ArcBasicZoneObjectInfo import ArcBasicZoneObjectInfo
class ArcPropInfo:
def load_binary(self, stream: ResStream):
self.prop_basic_zone = ArcBasicZoneObjectInfo()
self.prop_basic_zone.load_binary(stream)
self.prop_has_platform = stream.read_bool()
self.prop_platform_height = stream.read_float()
self.prop_is_light_data = stream.read_bool()
if self.prop_is_light_data:
self.prop_light_color = [stream.read_dword() for _ in range(4)]
self.prop_light_radius = stream.read_float()
self.prop_light_flicker = stream.read_dword()
self.prop_light_cube_map = stream.read_dword()
num_content_props = stream.read_dword()
self.prop_content_props = [ArcProp() for _ in range(num_content_props)]
for prop in self.prop_content_props:
prop.load_binary(stream)
num_content_mobiles = stream.read_dword()
self.prop_content_mobiles = [ArcMobile() for _ in range(num_content_mobiles)]
for mobile in self.prop_content_mobiles:
mobile.load_binary(stream)
num_descriptors = stream.read_dword()
self.prop_descriptors = [stream.read_string() for _ in range(num_descriptors)]
self.prop_registry = stream.read_dword()
if self.prop_registry:
self.prop_registry_name = stream.read_string()
self.prop_has_zone_event = stream.read_bool()
self.prop_has_teleporter = stream.read_bool()
if self.prop_has_zone_event:
self.prop_zone_event = stream.read_dword()
if self.prop_has_teleporter:
self.prop_teleporter = stream.read_dword()
def save_binary(self, stream: ResStream):
self.prop_basic_zone.save_binary(stream)
stream.write_bool(self.prop_has_platform)
stream.write_float(self.prop_platform_height)
stream.write_bool(self.prop_is_light_data)
if self.prop_is_light_data:
for i in range(4):
stream.write_dword(self.prop_light_color[i])
stream.write_float(self.prop_light_radius)
stream.write_dword(self.prop_light_flicker)
stream.write_dword(self.prop_light_cube_map)
stream.write_dword(len(self.prop_content_props))
for prop in self.prop_content_props:
prop.save_binary(stream)
stream.write_dword(len(self.prop_content_mobiles))
for mobile in self.prop_content_mobiles:
mobile.save_binary(stream)
stream.write_dword(len(self.prop_descriptors))
for descriptor in self.prop_descriptors:
stream.write_string(descriptor)
stream.write_dword(self.prop_registry)
if self.prop_registry:
stream.write_string(self.prop_registry_name)
stream.write_bool(self.prop_has_zone_event)
stream.write_bool(self.prop_has_teleporter)
if self.prop_has_zone_event:
stream.write_dword(self.prop_zone_event)
if self.prop_has_teleporter:
stream.write_dword(self.prop_teleporter)
def save_json(self):
data = OrderedDict()
data['prop_basic_zone'] = self.prop_basic_zone.save_json()
data['prop_has_platform'] = self.prop_has_platform
data['prop_platform_height'] = self.prop_platform_height
data['prop_is_light_data'] = self.prop_is_light_data
if self.prop_is_light_data:
data['prop_light_color'] = self.prop_light_color
data['prop_light_radius'] = self.prop_light_radius
data['prop_light_flicker'] = self.prop_light_flicker
data['prop_light_cube_map'] = self.prop_light_cube_map
data['prop_content_props'] = []
for prop in self.prop_content_props:
data['prop_content_props'].append(prop.save_json())
data['prop_content_mobiles'] = []
for mobile in self.prop_content_mobiles:
data['prop_content_mobiles'].append(mobile.save_json())
data['prop_descriptors'] = self.prop_descriptors
data['prop_registry'] = self.prop_registry
if self.prop_registry:
data['prop_registry_name'] = self.prop_registry_name
data['prop_has_zone_event'] = self.prop_has_zone_event
data['prop_has_teleporter'] = self.prop_has_teleporter
if self.prop_has_zone_event:
data['prop_zone_event'] = hash_to_string(self.prop_zone_event)
if self.prop_has_teleporter:
data['prop_teleporter'] = hash_to_string(self.prop_teleporter)
return data
def load_json(self, data):
self.prop_basic_zone = ArcBasicZoneObjectInfo()
self.prop_basic_zone.load_json(data['prop_basic_zone'])
self.prop_has_platform = data['prop_has_platform']
self.prop_platform_height = data['prop_platform_height']
self.prop_is_light_data = data['prop_is_light_data']
if self.prop_is_light_data:
self.prop_light_color = data['prop_light_color']
self.prop_light_radius = data['prop_light_radius']
self.prop_light_flicker = data['prop_light_flicker']
self.prop_light_cube_map = data['prop_light_cube_map']
self.prop_content_props = []
for prop_data in data['prop_content_props']:
prop = ArcProp()
prop.load_json(prop_data)
self.prop_content_props.append(prop)
self.prop_content_mobiles = []
for mobile_data in data['prop_content_mobiles']:
mobile = ArcMobile()
mobile.load_json(mobile_data)
self.prop_content_mobiles.append(mobile)
self.prop_descriptors = data['prop_descriptors']
self.prop_registry = data['prop_registry']
if self.prop_registry:
self.prop_registry_name = data['prop_registry_name']
self.prop_has_zone_event = data['prop_has_zone_event']
self.prop_has_teleporter = data['prop_has_teleporter']
if self.prop_has_zone_event:
self.prop_zone_event = string_to_hash(data['prop_zone_event'])
if self.prop_has_teleporter:
self.prop_teleporter = string_to_hash(data['prop_teleporter'])
class ArcCityPropInfo(ArcPropInfo):
def load_binary(self, stream: ResStream):
super().load_binary(stream)
self.city_prop_gm_guild = stream.read_dword()
self.city_prop_gm_nation = stream.read_dword()
self.city_prop_asset_rank = stream.read_dword()
self.city_prop_asset_funds = stream.read_dword()
def save_binary(self, stream: ResStream):
super().save_binary(stream)
stream.write_dword(self.city_prop_gm_guild)
stream.write_dword(self.city_prop_gm_nation)
stream.write_dword(self.city_prop_asset_rank)
stream.write_dword(self.city_prop_asset_funds)
def save_json(self):
data = super().save_json()
data['city_prop_gm_guild'] = self.city_prop_gm_guild
data['city_prop_gm_nation'] = self.city_prop_gm_nation
data['city_prop_asset_rank'] = self.city_prop_asset_rank
data['city_prop_asset_funds'] = self.city_prop_asset_funds
return data
def load_json(self, data):
super().load_json(data)
self.city_prop_gm_guild = data['city_prop_gm_guild']
self.city_prop_gm_nation = data['city_prop_gm_nation']
self.city_prop_asset_rank = data['city_prop_asset_rank']
self.city_prop_asset_funds = data['city_prop_asset_funds']
class ArcContainerInfo(ArcPropInfo):
def load_binary(self, stream: ResStream):
super().load_binary(stream)
self.container_locked = stream.read_dword()
self.container_locked_rank = stream.read_dword()
self.container_barred = stream.read_dword()
self.container_barred_rank = stream.read_dword()
self.container_trapped = stream.read_dword()
self.container_trapped_rank = stream.read_dword()
num_booties = stream.read_dword()
self.container_booties = [Inventory() for _ in range(num_booties)]
for inventory in self.container_booties:
inventory.load_binary(stream)
def save_binary(self, stream: ResStream):
super().save_binary(stream)
stream.write_dword(self.container_locked)
stream.write_dword(self.container_locked_rank)
stream.write_dword(self.container_barred)
stream.write_dword(self.container_barred_rank)
stream.write_dword(self.container_trapped)
stream.write_dword(self.container_trapped_rank)
stream.write_dword(len(self.container_booties))
for inventory in self.container_booties:
inventory.save_binary(stream)
def save_json(self):
data = super().save_json()
data['container_locked'] = self.container_locked
data['container_locked_rank'] = self.container_locked_rank
data['container_barred'] = self.container_barred
data['container_barred_rank'] = self.container_barred_rank
data['container_trapped'] = self.container_trapped
data['container_trapped_rank'] = self.container_trapped_rank
data['container_booties'] = []
for inventory in self.container_booties:
data['container_booties'].append(inventory.save_json())
return data
def load_json(self, data):
super().load_json(data)
self.container_locked = data['container_locked']
self.container_locked_rank = data['container_locked_rank']
self.container_barred = data['container_barred']
self.container_barred_rank = data['container_barred_rank']
self.container_trapped = data['container_trapped']
self.container_trapped_rank = data['container_trapped_rank']
self.container_booties = []
for inventory_data in data['container_booties']:
inventory = Inventory()
inventory.load_json(inventory_data)
self.container_booties.append(inventory)
class ArcProp:
def load_binary(self, stream: ResStream):
self.prop_type = stream.read_dword()
if self.prop_type == 5:
self.prop_data = ArcPropInfo()
self.prop_data.load_binary(stream)
elif self.prop_type == 6:
self.prop_data = ArcCityPropInfo()
self.prop_data.load_binary(stream)
elif self.prop_type == 7:
self.prop_data = ArcContainerInfo()
self.prop_data.load_binary(stream)
def save_binary(self, stream: ResStream):
stream.write_dword(self.prop_type)
self.prop_data.save_binary(stream)
def save_json(self):
data = OrderedDict()
data['prop_type'] = PROP_TO_STRING[self.prop_type]
data['prop_data'] = self.prop_data.save_json()
return data
def load_json(self, data):
self.prop_type = STRING_TO_PROP[data['prop_type']]
if self.prop_type == 5:
self.prop_data = ArcPropInfo()
elif self.prop_type == 6:
self.prop_data = ArcCityPropInfo()
elif self.prop_type == 7:
self.prop_data = ArcContainerInfo()
self.prop_data.load_json(data['prop_data'])