from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.schema import GsiGridSchema from sims4.log import generate_message_with_callstack import services gsi_dump_schema = GsiGridSchema(label='GSI Dump Log') gsi_dump_schema.add_field('game_time', label='Game Time') gsi_dump_schema.add_field('gsi_filename', label='Filename') gsi_dump_schema.add_field('error_log_or_exception', label='Error', width=4) gsi_dump_schema.add_field('callstack', label='Callstack', width=4) gsi_dump_archiver = GameplayArchiver('gsi_dump_log', gsi_dump_schema, add_to_archive_enable_functions=True) def archive_gsi_dump(filename_str, error_str): callstack = generate_message_with_callstack('GSI Dump') archive_data = {'game_time': str(services.time_service().sim_now), 'gsi_filename': filename_str, 'error_log_or_exception': error_str, 'callstack': callstack} gsi_dump_archiver.archive(data=archive_data)
from gsi_handlers.sim_handlers import _get_sim_info_by_id from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema familiar_schema = GsiGridSchema(label='Familiars', sim_specific=True) familiar_schema.add_field('familiar_name', label='Name') familiar_schema.add_field('familiar_type', label='Type') familiar_schema.add_field('familiar_active', label='Active') @GsiHandler('familiar_view', familiar_schema) def generate_sim_skill_view_data(sim_id: int = None): familiar_data = [] cur_sim_info = _get_sim_info_by_id(sim_id) if cur_sim_info is not None: familiar_tracker = cur_sim_info.familiar_tracker if familiar_tracker is not None: active_familiar_id = familiar_tracker.active_familiar_id for familiar_info in familiar_tracker: if active_familiar_id is None: familiar_active = False else: familiar_active = familiar_info.uid == active_familiar_id entry = { 'familiar_name': familiar_info.raw_name, 'familiar_type': str(familiar_info.familiar_type), 'familiar_active': str(familiar_active) } familiar_data.append(entry) return familiar_data
from gsi_handlers.gameplay_archiver import GameplayArchiver from gsi_handlers.gsi_utils import format_enum_name from performance.performance_commands import get_sim_info_creation_sources from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers import services sim_info_lifetime_archive_schema = GsiGridSchema( label='Sim Info Lifetime Archive', sim_specific=False) sim_info_lifetime_archive_schema.add_field('game_time', label='Game/Sim Time', type=GsiFieldVisualizers.TIME) sim_info_lifetime_archive_schema.add_field('total_sim_info_count', label='Total Sim Infos', type=GsiFieldVisualizers.INT) sim_info_lifetime_archive_schema.add_field('event_type', label='Event Type', type=GsiFieldVisualizers.STRING) sim_info_lifetime_archive_schema.add_field('sim_id', label='Sim ID', type=GsiFieldVisualizers.INT) sim_info_lifetime_archive_schema.add_field('sim_name', label='Sim Name', type=GsiFieldVisualizers.STRING) sim_info_lifetime_archive_schema.add_field('creation_source', label='Creation Source', type=GsiFieldVisualizers.STRING) sim_info_lifetime_archive_schema.add_field('situations', label='Situations', type=GsiFieldVisualizers.STRING) sim_info_lifetime_archive_schema.add_field('household_id', label='Household Id', type=GsiFieldVisualizers.INT)
from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers import objects.components.types import services game_component_schema = GsiGridSchema(label='Game Component Info') game_component_schema.add_field('current_game', label='Current Game', type=GsiFieldVisualizers.STRING) game_component_schema.add_field('target_object', label='Target Object', type=GsiFieldVisualizers.STRING) game_component_schema.add_field('number_of_players', label='Number Of Players', type=GsiFieldVisualizers.INT) game_component_schema.add_field('winning_sims', label='Winners', type=GsiFieldVisualizers.STRING) game_component_schema.add_field('joinable', label='Joinable', type=GsiFieldVisualizers.STRING) game_component_schema.add_field('requires_setup', label='Requires Setup', type=GsiFieldVisualizers.STRING) game_component_schema.add_field('game_over', label='Game Over', type=GsiFieldVisualizers.STRING) game_component_schema.add_field('high_score', label='High Score', type=GsiFieldVisualizers.FLOAT) game_component_schema.add_field('high_score_sim_ids',
from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers import services import sims4.resources sim_whim_schema = GsiGridSchema(label='Whims/Whims Current', sim_specific=True) sim_whim_schema.add_field('sim_id', label='Sim ID', hidden=True) sim_whim_schema.add_field('whim', label='Whim', unique_field=True, width=3) sim_whim_schema.add_field('instance', label='Instance', width=3) sim_whim_schema.add_field('whimset', label='Whimset', width=3) sim_whim_schema.add_field('target', label='Target', width=2) sim_whim_schema.add_field('value', label='Value', width=1, type=GsiFieldVisualizers.INT) @GsiHandler('sim_whim_view', sim_whim_schema) def generate_sim_whim_view_data(sim_id:int=None): whim_view_data = [] sim_info_manager = services.sim_info_manager() if sim_info_manager is not None: for sim_info in sim_info_manager.objects: if sim_info.sim_id == sim_id: whim_tracker = sim_info._whim_tracker if whim_tracker is None: continue for (whim, source_whimset) in whim_tracker.whims_and_parents_gen(): whim_data = {'sim_id': str(sim_info.sim_id), 'whim': whim.get_gsi_name(), 'instance': whim.__class__.__name__, 'whimset': source_whimset.__name__, 'target': str(whim_tracker.get_whimset_target(source_whimset)), 'value': whim.score} whim_view_data.append(whim_data) return whim_view_data sim_activeset_schema = GsiGridSchema(label='Whims/Whimsets Active', sim_specific=True) sim_activeset_schema.add_field('sim_id', label='Sim ID', hidden=True) sim_activeset_schema.add_field('whimset', label='Whimset', unique_field=True, width=3) sim_activeset_schema.add_field('priority', label='Priority', width=1, type=GsiFieldVisualizers.INT)
from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers balloon_archive_schema = GsiGridSchema(label='Balloons', sim_specific=True) balloon_archive_schema.add_field('sim', label='Sim', width=2) balloon_archive_schema.add_field('interaction', label='Interaction', width=2) balloon_archive_schema.add_field('balloon_type', label='Type', width=2) balloon_archive_schema.add_field('icon', label='Icon', width=2) balloon_archive_schema.add_field('balloon_category', label='Category', width=2) balloon_archive_schema.add_field('weight', label='Weight', type=GsiFieldVisualizers.INT, width=1) balloon_archive_schema.add_field('total_weight', label='Total Weight', type=GsiFieldVisualizers.INT, width=1) with balloon_archive_schema.add_has_many('Considered', GsiGridSchema) as sub_schema: sub_schema.add_field('test_result', label='Test Result', width=2) sub_schema.add_field('balloon_type', label='Type', width=2) sub_schema.add_field('icon', label='Icon', width=2) sub_schema.add_field('weight', label='Weight', type=GsiFieldVisualizers.INT, width=1) sub_schema.add_field('balloon_category', label='Category', width=2) archiver = GameplayArchiver('balloon', balloon_archive_schema) def archive_balloon_data(sim, interaction, result, icon, entries):
schema.add_field('size', label='Size', width=0.5) schema.add_field('manager', label='Manager', width=1) schema.add_field('mask', label='Mask Override', width=1) schema.add_field('blockers', label='Blockers(Mgr:Obj:Mask)', width=2.5) schema.add_field('tags', label='Barriers(Tag:Mask)', width=1.75) schema.add_field('details', label='Message Details', width=5) schema.add_view_cheat('distributor.gsi.toggle_op_details', label='Toggle Details') with schema.add_view_cheat('distributor.gsi.hide_op', label='Hide Selected Type') as cheat: cheat.add_token_param('type') schema.add_view_cheat('distributor.gsi.show_all_ops', label='Show All Types') distributor_archive_schema = GsiGridSchema(label='Distributor Log') _configure_distributor_schema(distributor_archive_schema) archiver = GameplayArchiver('Distributor', distributor_archive_schema, max_records=250) sim_distributor_archive_schema = GsiGridSchema(label='Distributor Log Sim', sim_specific=True) _configure_distributor_schema(sim_distributor_archive_schema) sim_archiver = GameplayArchiver('SimDistributor', sim_distributor_archive_schema, max_records=150) with sims4.reload.protected(globals()): LOG_OP_DETAILS = False EXCLUDE_OP_TYPES = { DistributorOps_pb2.Operation.HEARTBEAT, DistributorOps_pb2.Operation.SET_GAME_TIME
from aspirations.aspiration_tuning import Aspiration from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema import aspirations.aspirations import services import sims4.resources from gsi_handlers.gameplay_archiver import GameplayArchiver aspiration_schema = GsiGridSchema(label='Aspirations', sim_specific=True) aspiration_schema.add_field('aspiration_uid', label='UId', unique_field=True) aspiration_schema.add_field('aspiration', label='Aspiration', width=3) aspiration_schema.add_field('aspiration_complete', label='Done') aspiration_schema.add_field('display_name', label='DisplayStr', hidden=True) aspiration_schema.add_field('description', label='DescStr', hidden=True) aspiration_schema.add_field('auto_select', label='Auto Select', hidden=True) aspiration_schema.add_field('simId', label='SimId', hidden=True) with aspiration_schema.add_view_cheat('aspirations.complete_aspiration', label='Complete') as cheat: cheat.add_token_param('aspiration_uid') cheat.add_token_param('simId') with aspiration_schema.add_has_many('objectives', GsiGridSchema, label='Objectives') as sub_schema: sub_schema.add_field('objective', label='Objective') sub_schema.add_field('objective_complete', label='Done') @GsiHandler('aspiration_view', aspiration_schema) def generate_aspiration_view_data(sim_id:int=None): sim_info = services.sim_info_manager().get(sim_id) aspiration_manager = services.get_instance_manager(sims4.resources.Types.ASPIRATION) all_aspirations = [] for aspiration_id in aspiration_manager.types: aspiration = aspiration_manager.get(aspiration_id) aspiration_data = {} aspiration_data['aspiration'] = str(aspiration)
self.path_cost = 0 self.dest_spec = None self.all_goals = [] self.path_progress = 0 self.path_cost_log = [] self.path_goal_costs = [] self.possible_constraints = [] self.possible_path_destinations = {} self.all_handles = [] self.sources_and_destinations = [] self.transition_templates = [] self.cur_posture_interaction = None self.all_possible_paths = [] self.all_goal_costs = [] trans_path_archive_schema = GsiGridSchema(label='Transition Log', sim_specific=True) trans_path_archive_schema.add_field('id', label='ID', hidden=True) trans_path_archive_schema.add_field('sim_name', label='Sim Name', width=150, hidden=True) trans_path_archive_schema.add_field('interaction', label='Interaction', width=150) trans_path_archive_schema.add_field('path_success', label='Success', width=65) trans_path_archive_schema.add_field('path_progress', label='Progress', width=65) trans_path_archive_schema.add_field('path', label='Chosen Path', width=450) trans_path_archive_schema.add_field('destSpec', label='Dest Spec', width=350) trans_path_archive_schema.add_field('pathCost', label='Cost') trans_path_archive_schema.add_field('posture_state', label='Posture State', hidden=True) with trans_path_archive_schema.add_has_many('all_constraints', GsiGridSchema) as sub_schema: sub_schema.add_field('build_pass', label='Pass', width=0.15) sub_schema.add_field('cur_constraint', label='Constraint') sub_schema.add_field('constraint_type', label='Type', width=0.15) sub_schema.add_field('constraint_geometry', label='Geometry') with trans_path_archive_schema.add_has_many('templates', GsiGridSchema) as sub_schema:
from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.schema import GsiGridSchema ambient_archive_schema = GsiGridSchema(label='Ambient Log') ambient_archive_schema.add_field('sources', label='Sources') archiver = GameplayArchiver('ambient', ambient_archive_schema) def archive_ambient_data(description): entry = {} entry['sources'] = description archiver.archive(data=entry)
from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers import date_and_time import services situation_sim_schema = GsiGridSchema(label='Situation Manager') situation_sim_schema.add_field('situation_id', label='Situation Id', width=1, unique_field=True) situation_sim_schema.add_field('situation', label='Situation Name', width=3) situation_sim_schema.add_field('state', label='State', width=1.5) situation_sim_schema.add_field('time_left', label='Time Left') situation_sim_schema.add_field('sim_count', label='Number of Sims', type=GsiFieldVisualizers.INT, width=0.5) situation_sim_schema.add_field('score', label='Score', type=GsiFieldVisualizers.FLOAT, width=0.5) situation_sim_schema.add_field('level', label='Level', width=1) with situation_sim_schema.add_has_many('Sims', GsiGridSchema) as sub_schema: sub_schema.add_field('sim_name', label='Sim') sub_schema.add_field('sim_score', label='Score', type=GsiFieldVisualizers.FLOAT) sub_schema.add_field('sim_job', label='Job') sub_schema.add_field('sim_role', label='Role') sub_schema.add_field('sim_emotion', label='Emotion') sub_schema.add_field('sim_on_active_lot', label='On Active Lot') with situation_sim_schema.add_has_many('Goals', GsiGridSchema) as sub_schema: sub_schema.add_field('goal', label='Goal') sub_schema.add_field('goal_set', label='Goal Set') sub_schema.add_field('time_created', label='Time Created') sub_schema.add_field('time_completed', label='Time Completed') sub_schema.add_field('score', label='Score', type=GsiFieldVisualizers.INT, width=1) with situation_sim_schema.add_has_many('Churn', GsiGridSchema) as sub_schema: sub_schema.add_field('sim_job', label='Job') sub_schema.add_field('min', label='Min', type=GsiFieldVisualizers.INT, width=1) sub_schema.add_field('max', label='Max', type=GsiFieldVisualizers.INT, width=1) sub_schema.add_field('here', label='Sims Here', type=GsiFieldVisualizers.INT, width=1) sub_schema.add_field('coming', label='Sims Coming', type=GsiFieldVisualizers.INT, width=1)
from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers import objects.components.types import services game_component_schema = GsiGridSchema(label='Game Component Info') game_component_schema.add_field('current_game', label='Current Game', type=GsiFieldVisualizers.STRING) game_component_schema.add_field('target_object', label='Target Object', type=GsiFieldVisualizers.STRING) game_component_schema.add_field('active_sims', label='Active Sims', type=GsiFieldVisualizers.STRING) game_component_schema.add_field('number_of_players', label='Number Of Players', type=GsiFieldVisualizers.INT) game_component_schema.add_field('winning_sims', label='Winners', type=GsiFieldVisualizers.STRING) game_component_schema.add_field('joinable', label='Joinable', type=GsiFieldVisualizers.STRING) game_component_schema.add_field('requires_setup', label='Requires Setup', type=GsiFieldVisualizers.STRING) game_component_schema.add_field('game_over', label='Game Over', type=GsiFieldVisualizers.STRING) @GsiHandler('game_info', game_component_schema) def generate_game_info_data(): game_info = [] for obj in services.object_manager().get_all_objects_with_component_gen(objects.components.types.GAME_COMPONENT): if obj.game_component.current_game is None: pass game = obj.game_component if game.active_sims: active_sims = ','.join([str(sim) for sim in game.active_sims]) else: active_sims = 'None' if game.winning_team is not None: winning_sims = ','.join([str(sim) for sim in game.winning_team]) else: winning_sims = 'None' entry = {'current_game': str(game.current_game), 'target_object': str(game.target_object), 'active_sims': active_sims, 'number_of_players': str(game.number_of_players), 'winning_sims': winning_sims, 'joinable': str(game.is_joinable()), 'requires_setup': str(game.requires_setup), 'game_over': str(game.game_has_ended)}
from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers from sims4.resources import Types import services def generate_all_careers(): return [cls.__name__ for cls in services.get_instance_manager(Types.CAREER).types.values()] sim_career_schema = GsiGridSchema(label='Careers') sim_career_schema.add_field('sim', label='Sim', width=2, unique_field=True) sim_career_schema.add_field('sim_id', label='Sim ID', hidden=True) sim_career_schema.add_field('career_uid', label='UID', hidden=True) sim_career_schema.add_field('name', label='Name', width=2) sim_career_schema.add_field('level', label='Level') sim_career_schema.add_field('time_to_work', label='Time To Work') sim_career_schema.add_field('current_work_time', label='Current Work') sim_career_schema.add_field('next_work_time', label='Next Work') sim_career_schema.add_field('is_work_time', label='Is Work Time') sim_career_schema.add_field('currently_at_work', label='Currently At Work') sim_career_schema.add_field('attended_work', label='Attended Work') sim_career_schema.add_field('work_performance', label='Performance', type=GsiFieldVisualizers.INT) sim_career_schema.add_field('active_situation_id', label='Situation ID', type=GsiFieldVisualizers.INT) with sim_career_schema.add_has_many('career_levels', GsiGridSchema, label='Levels') as sub_schema: sub_schema.add_field('name', label='Name') sub_schema.add_field('simoleons', label='Simoleons/Hr') sub_schema.add_field('fired_lvl', label='Fire Lvl') sub_schema.add_field('demotion_lvl', label='Demotion Lvl') sub_schema.add_field('promote_lvl', label='Promote Lvl') with sim_career_schema.add_has_many('objectives', GsiGridSchema, label='Current Objectives') as sub_schema: sub_schema.add_field('objective', label='Objective') sub_schema.add_field('is_complete', label='Complete?')
import itertools from build_buy import get_object_slotset, get_object_decosize from interactions import ParticipantType from interactions.constraints import GLOBAL_STUB_ACTOR, GLOBAL_STUB_TARGET from interactions.utils.animation import InteractionAsmType from interactions.utils.animation_reference import get_animation_reference_usage from objects.components.slot_component import SlotComponent from objects.slots import get_slot_type_set_from_key, DecorativeSlotTuning from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers from sims4.repr_utils import callable_repr import native.animation import services import sims4.resources slot_type_schema = GsiGridSchema(label='Tuning/Slot Types') slot_type_schema.add_field('slot_type_name', label='Name', unique_field=True) slot_type_schema.add_field('slot_type_name_hash', label='Hash', type=GsiFieldVisualizers.INT) slot_type_schema.add_field('slot_type_name_hashx', label='Hex Hash') slot_type_schema.add_field('bone_name', label='Bone Name') slot_type_schema.add_field('bone_name_hash', label='Bone Name Hash', type=GsiFieldVisualizers.INT) slot_type_schema.add_field('bone_name_hashx', label='Bone Name Hex Hash') with slot_type_schema.add_has_many('objects', GsiGridSchema, label='Objects that go in this type of slot') as sub_schema: sub_schema.add_field('id', label='Definition ID', unique_field=True) sub_schema.add_field('name', label='Definition Tuning') sub_schema.add_field('object_name', label='Object Tuning') with slot_type_schema.add_has_many('slot_type_sets', GsiGridSchema, label='Part of these slot type sets') as sub_schema: sub_schema.add_field('name', label='Name', unique_field=True) with slot_type_schema.add_has_many('object_slots', GsiGridSchema, label='Objects with this type of slot') as sub_schema: sub_schema.add_field('id', label='Catalog ID', width=0.25, unique_field=True) sub_schema.add_field('tuning_id', label='Tuning ID') sub_schema.add_field('object_name', label='Object Tuning')
import traceback from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers import routing planner_archive_schema = GsiGridSchema(label='Path Planner Log') planner_archive_schema.add_field('result', label='Result', width=2) planner_archive_schema.add_field('planner_name', label='Source', width=2) planner_archive_schema.add_field('planner_id', label='Planner ID', width=2, hidden=True) planner_archive_schema.add_field('x', label='Start X', type=GsiFieldVisualizers.FLOAT, width=2) planner_archive_schema.add_field('y', label='Start Y', type=GsiFieldVisualizers.FLOAT, width=2, hidden=True) planner_archive_schema.add_field('z', label='Start Z', type=GsiFieldVisualizers.FLOAT, width=2) planner_archive_schema.add_field('qx', label='Start QX', type=GsiFieldVisualizers.FLOAT, width=2, hidden=True) planner_archive_schema.add_field('qy', label='Start QY', type=GsiFieldVisualizers.FLOAT, width=2, hidden=True) planner_archive_schema.add_field('qz', label='Start QZ', type=GsiFieldVisualizers.FLOAT, width=2, hidden=True) planner_archive_schema.add_field('qw', label='Start QW', type=GsiFieldVisualizers.FLOAT, width=2, hidden=True) planner_archive_schema.add_field('level', label='Start Level', type=GsiFieldVisualizers.INT, width=2) planner_archive_schema.add_field('ticks', label='Sleep Count', type=GsiFieldVisualizers.INT, width=2) planner_archive_schema.add_field('time', label='Sleep Time ms', type=GsiFieldVisualizers.FLOAT, width=2) planner_archive_schema.add_field('plan_time', label='Plan Time ms', type=GsiFieldVisualizers.FLOAT, width=2) planner_archive_schema.add_field('dist', label='Distance', type=GsiFieldVisualizers.FLOAT, width=2) planner_archive_schema.add_field('num_goals', label='Num Goals', type=GsiFieldVisualizers.INT, width=2) planner_archive_schema.add_field('num_starts', label='Num Starts', type=GsiFieldVisualizers.INT, width=2) planner_archive_schema.add_view_cheat('routing.serialize_pathplanner_data', label='Serialize Path Planner Data') with planner_archive_schema.add_has_many('Goals', GsiGridSchema) as sub_schema: sub_schema.add_field('index', label='Index', type=GsiFieldVisualizers.INT, width=2) sub_schema.add_field('x', label='X', type=GsiFieldVisualizers.FLOAT, width=2) sub_schema.add_field('z', label='Z', type=GsiFieldVisualizers.FLOAT, width=2) sub_schema.add_field('level', label='Level', type=GsiFieldVisualizers.INT, width=2) sub_schema.add_field('cost', label='Cost', type=GsiFieldVisualizers.FLOAT, width=2) sub_schema.add_field('final_cost', label='Final Cost (lower==better)', type=GsiFieldVisualizers.FLOAT, width=2) sub_schema.add_field('result', label='Result', width=2)
import itertools import re from gsi_handlers.gameplay_archiver import GameplayArchiver from objects.game_object import GameObject from sims4.gsi.dispatcher import GsiHandler, add_cheat_schema from sims4.gsi.schema import GsiGridSchema, GSIGlobalCheatSchema, GsiFieldVisualizers import gsi_handlers.gsi_utils import services import sims4 global_object_cheats_schema = GSIGlobalCheatSchema() global_object_cheats_schema.add_cheat('objects.clear_lot', label='Clear Lot') add_cheat_schema('global_object_cheats', global_object_cheats_schema) object_manager_schema = GsiGridSchema(label='Object Manager') object_manager_schema.add_field('mgr', label='Manager', width=1, hidden=True) object_manager_schema.add_field('objId', label='Object Id', width=3, unique_field=True) object_manager_schema.add_field('classStr', label='Class', width=3) object_manager_schema.add_field('modelStr', label='Model', width=3) object_manager_schema.add_field('locX', label='X', width=1) object_manager_schema.add_field('locY', label='Y', width=1) object_manager_schema.add_field('locZ', label='Z', width=1) object_manager_schema.add_field('on_active_lot', label='On Active Lot', width=1, hidden=True) object_manager_schema.add_field('current_value', label='Value', width=1) object_manager_schema.add_field('isSurface', label='Surface', width=1) object_manager_schema.add_field('parent', label='Parent', width=2) object_manager_schema.add_field('inUseBy', label='In Use By', width=2) object_manager_schema.add_field('lockouts', label='Lockouts', width=2) object_manager_schema.add_field('transient', label='Transient', width=1, hidden=True) object_manager_schema.add_field('is_interactable', label='Interactable', width=1, hidden=True) object_manager_schema.add_field('footprint', label='Footprint', width=1, hidden=True) object_manager_schema.add_field('inventory_owner_id', label='inventory owner id', width=2, hidden=True) object_manager_schema.add_filter('on_active_lot')
from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers import objects.components.types import services game_component_schema = GsiGridSchema(label='Game Component Info') game_component_schema.add_field('current_game', label='Current Game', type=GsiFieldVisualizers.STRING) game_component_schema.add_field('target_object', label='Target Object', type=GsiFieldVisualizers.STRING) game_component_schema.add_field('active_sims', label='Active Sims', type=GsiFieldVisualizers.STRING) game_component_schema.add_field('number_of_players', label='Number Of Players', type=GsiFieldVisualizers.INT) game_component_schema.add_field('winning_sims', label='Winners', type=GsiFieldVisualizers.STRING) game_component_schema.add_field('joinable', label='Joinable', type=GsiFieldVisualizers.STRING) game_component_schema.add_field('requires_setup', label='Requires Setup', type=GsiFieldVisualizers.STRING) game_component_schema.add_field('game_over', label='Game Over', type=GsiFieldVisualizers.STRING)
from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.schema import GsiGridSchema speed_change_schema = GsiGridSchema(label='Speed Change Request Log') speed_change_schema.add_field('sim', label='Sim') speed_change_schema.add_field('interaction', label='Interaction', width=3) speed_change_schema.add_field('request_type', label='Request Type') speed_change_schema.add_field('requested_speed', label='Requested Speed') speed_change_schema.add_field('is_request', label='Is Request') speed_change_archiver = GameplayArchiver('speed_change_log', speed_change_schema) def archive_speed_change(interaction, request_type, requested_speed, is_request): archive_data = {'sim': str(interaction.sim), 'interaction': str(interaction), 'request_type': str(request_type), 'requested_speed': str(requested_speed), 'is_request': is_request} speed_change_archiver.archive(data=archive_data)
from gsi_handlers.commodity_tracker_gsi_util import generate_data_from_commodity_tracker, create_schema_for_commodity_tracker from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers import services import sims4 import build_buy lot_info_schema = GsiGridSchema(label='Lot Info', auto_refresh=False) lot_info_schema.add_field('neighborhood', label='Neighborhood', unique_field=True) lot_info_schema.add_field('cur_lot', label='Current Lot', width=0.4) lot_info_schema.add_field('region_id', label='Region ID', type=GsiFieldVisualizers.INT, width=0.5) lot_info_schema.add_field('lot_desc_id', label='Description ID', type=GsiFieldVisualizers.INT, width=0.5) lot_info_schema.add_field('zone_id', label='Zone ID') lot_info_schema.add_field('venue', label='Venue') lot_info_schema.add_field('lot_name', label='Lot Name') with lot_info_schema.add_has_many( 'statistics', GsiGridSchema, label='Statistics (Current Lot Only)') as sub_schema: sub_schema.add_field('statistic', label='Statistic') sub_schema.add_field('value', label='Statistic Value', type=GsiFieldVisualizers.FLOAT, width=0.5)
from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiFieldVisualizers, GsiGridSchema import autonomy.autonomy_modes import services autonomy_archive_schema = GsiGridSchema(label='Autonomy Log', sim_specific=True) autonomy_archive_schema.add_field('sim_name', label='Sim Name', width=2) autonomy_archive_schema.add_field('result', label='Result', width=5) autonomy_archive_schema.add_field('type', label='Type', width=2) with autonomy_archive_schema.add_has_many('Affordances', GsiGridSchema) as sub_schema: sub_schema.add_field('affordance', label='Affordance', width=3) sub_schema.add_field('target', label='Target', width=2) sub_schema.add_field('affordance_status', label='Status', width=5) sub_schema.add_field('autonomy_stage', label='Stage', width=2) sub_schema.add_field('affordance_score', label='Score', type=GsiFieldVisualizers.FLOAT, width=1) sub_schema.add_field('multitask_percentage', label='Multitask %', type=GsiFieldVisualizers.FLOAT, width=1) sub_schema.add_field('scoring_priority', label='Scoring Priority', width=2) sub_schema.add_field('affordance_relevant_desires', label='Relevant Desires', width=4) sub_schema.add_field('affordance_details', label='Details', width=6) with autonomy_archive_schema.add_has_many('Probability', GsiGridSchema) as sub_schema: sub_schema.add_field('affordance', label='Affordance', width=3) sub_schema.add_field('target', label='Target', width=2) sub_schema.add_field('affordance_score', label='Score', type=GsiFieldVisualizers.FLOAT, width=1) sub_schema.add_field('multitask_roll', label='Multitask Roll', type=GsiFieldVisualizers.FLOAT, width=1) sub_schema.add_field('probability', label='Probability', type=GsiFieldVisualizers.FLOAT, width=1) sub_schema.add_field('probability_type', label='Probability Type', width=4) with autonomy_archive_schema.add_has_many('Objects', GsiGridSchema) as sub_schema: sub_schema.add_field('object', label='Object', width=2) sub_schema.add_field('object_relevant_desires', label='Relevant Desires', width=4) sub_schema.add_field('object_status', label='Status', width=5) with autonomy_archive_schema.add_has_many('Commodities', GsiGridSchema) as sub_schema:
def _get_sim_instance_by_id(sim_id): sim_info_manager = services.sim_info_manager() if sim_info_manager is not None: for sim_info in sim_info_manager.objects: while sim_id == sim_info.sim_id: return sim_info.get_sim_instance(allow_hidden_flags=ALL_HIDDEN_REASONS) def _get_sim_info_by_id(sim_id): sim_info_manager = services.sim_info_manager() sim_info = None if sim_info_manager is not None: sim_info = sim_info_manager.get(sim_id) return sim_info static_commodity = GsiGridSchema(label='Statistics/Static Commodities', sim_specific=True) static_commodity.add_field('name', label='Name') @GsiHandler('static_commodity_view', static_commodity) def generate_sim_static_commodity_view_data(sim_id:int=None): stat_data = [] cur_sim_info = _get_sim_info_by_id(sim_id) if cur_sim_info is not None: for stat in list(cur_sim_info.static_commodity_tracker): stat_data.append({'name': type(stat).__name__}) return stat_data def generate_all_commodities(): return [cls.__name__ for cls in services.get_instance_manager(Types.STATISTIC).types.values() if issubclass(cls, statistics.commodity.Commodity)] commodity_view_schema = GsiBarChartSchema(label='Statistics/Commodities', sim_specific=True)
from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.schema import GsiFieldVisualizers, GsiGridSchema from sims4.log import generate_message_with_callstack import gsi_handlers import services skill_change_log_archive_schema = GsiGridSchema(label='Skill Change Log', sim_specific=True) skill_change_log_archive_schema.add_field('skill_name', label='Skill Name', width=3) skill_change_log_archive_schema.add_field('current_game_time', label='Game Time', width=1.5) skill_change_log_archive_schema.add_field('old_skill_value', label='Old Value', type=GsiFieldVisualizers.FLOAT) skill_change_log_archive_schema.add_field('new_skill_value', label='New Value', type=GsiFieldVisualizers.FLOAT) skill_change_log_archive_schema.add_field('new_level', label='New Level', type=GsiFieldVisualizers.INT) skill_change_log_archive_schema.add_field('time_delta', label='Time Change', type=GsiFieldVisualizers.INT) skill_change_log_archive_schema.add_field('skill_delta', label='Skill Per Min', type=GsiFieldVisualizers.INT) skill_change_archiver = GameplayArchiver('skill_change_log', skill_change_log_archive_schema) def archive_skill_change(sim, skill, time_delta, old_skill_value, new_skill_value, new_level, last_update): if time_delta != 0: skill_per_time = (new_skill_value - old_skill_value)/time_delta else: skill_per_time = 0 archive_data = {'skill_name': skill.skill_type.__name__, 'current_game_time': str(services.time_service().sim_now), 'old_skill_value': old_skill_value, 'new_skill_value': new_skill_value, 'new_level': new_level, 'time_delta': str(time_delta), 'skill_delta': skill_per_time} skill_change_archiver.archive(data=archive_data, object_id=sim.id) environment_score_archive_schema = GsiGridSchema(label='Environment Score Log', sim_specific=True) environment_score_archive_schema.add_field('primary_mood', label='Primary Mood') environment_score_archive_schema.add_field('score', label='Total Mood Score', type=GsiFieldVisualizers.FLOAT) environment_score_archive_schema.add_field('mood_commodity', label='Mood Commodity') environment_score_archive_schema.add_field('negative_score', label='Total Negative Score', type=GsiFieldVisualizers.FLOAT) environment_score_archive_schema.add_field('negative_commodity', label='Negative Commodity') environment_score_archive_schema.add_field('positive_score', label='Total Positive Score', type=GsiFieldVisualizers.FLOAT) environment_score_archive_schema.add_field('positive_commodity', label='Positive Commodity')
from clubs.club_enums import ClubHangoutSetting from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers import services import sims4.resources club_schema = GsiGridSchema(label='Club Info') club_schema.add_field('name', label='Name', type=GsiFieldVisualizers.STRING) club_schema.add_field('club_id', label='Club ID', type=GsiFieldVisualizers.STRING, unique_field=True) club_schema.add_field('hangout', label='Hangout Location', type=GsiFieldVisualizers.STRING) club_schema.add_field('associated_color', label='Associated Color', type=GsiFieldVisualizers.STRING) club_schema.add_field('uniform_male_child', label='Male Child Uniform', type=GsiFieldVisualizers.STRING) club_schema.add_field('uniform_female_child', label='Female Child Uniform', type=GsiFieldVisualizers.STRING) club_schema.add_field('uniform_male_adult', label='Male Adult Uniform', type=GsiFieldVisualizers.STRING) club_schema.add_field('uniform_female_adult', label='Female Child Uniform', type=GsiFieldVisualizers.STRING)
import telemetry_helper logger = sims4.log.Logger('InteractionLog') TELEMETRY_GROUP_INTERACTION = 'INTR' TELEMETRY_HOOK_SI_BEGIN = 'SIBE' TELEMETRY_HOOK_SI_END = 'SIEN' TELEMETRY_HOOK_MIXER_BEGIN = 'MIBE' TELEMETRY_HOOK_MIXER_END = 'MIEN' TELEMETRY_FIELD_INTERACTION_ID = 'idix' TELEMETRY_FIELD_TARGET_ID = 'idtx' TELEMETRY_FIELD_TARGET_TYPE = 'tptx' TELEMETRY_FIELD_SOURCE = 'sorc' TELEMETRY_FIELD_OUTCOME = 'outc' TELEMETRY_FIELD_GROUP_ID = 'idgr' TELEMETRY_HOOK_MAPPING = {('Process_SI', True): TELEMETRY_HOOK_SI_BEGIN, ('Running', False): TELEMETRY_HOOK_MIXER_BEGIN, ('Remove_SI', True): TELEMETRY_HOOK_SI_END, ('Done', False): TELEMETRY_HOOK_MIXER_END} writer = sims4.telemetry.TelemetryWriter(TELEMETRY_GROUP_INTERACTION) interactions_archive_schema = GsiGridSchema(label='Interaction Log', sim_specific=True) interactions_archive_schema.add_field('affordance', label='Affordance') interactions_archive_schema.add_field('phase', label='Phase') interactions_archive_schema.add_field('target', label='Target') interactions_archive_schema.add_field('context', label='Context') interactions_archive_schema.add_field('progress', label='Progress') interactions_archive_schema.add_field('message', label='Message') archiver = GameplayArchiver('interactions', interactions_archive_schema, enable_archive_by_default=True, max_records=200) _INTERACTION_LOG_FORMAT = '{sim:>24}, {phase:>16}, {name:>32}, {target:>32}, {progress:>8}, {context}, {msg}' _POSTURE_LOG_FORMAT = '{sim:>24}, {phase:>16}, {name:>32}, {target:>32}, , {msg}' def _get_csv_friendly_string(s): if s is not None: s = s.replace('"', "'") if ',' in s: s = '"{}"'.format(s)
from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.schema import GsiGridSchema outfit_change_archive_schema = GsiGridSchema(label='Outfit Change Archive', sim_specific=True) outfit_change_archive_schema.add_field('change_from', label='Change From') outfit_change_archive_schema.add_field('change_to', label='Change To') outfit_change_archive_schema.add_field('change_reason', label='Change Reason') archiver = GameplayArchiver('OutfitChanges', outfit_change_archive_schema, add_to_archive_enable_functions=True) def log_outfit_change(sim_info, change_to, change_reason): if sim_info is None: return entry = { 'change_from': repr(sim_info._current_outfit), 'change_to': repr(change_to), 'change_reason': repr(change_reason) } archiver.archive(data=entry, object_id=sim_info.id)
import itertools from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers import services group_schema = GsiGridSchema(label='Social Groups') group_schema.add_field('type', label='Group Type', width=1, unique_field=True) group_schema.add_field('count', label='Count', type=GsiFieldVisualizers.INT, width=0.5) group_schema.add_field('anchor', label='Anchor', width=1) group_schema.add_field('shutting_down', label='Shutting Down', width=0.4) with group_schema.add_has_many('states', GsiGridSchema, label='States') as sub_schema: sub_schema.add_field('state', label='State', width=1) sub_schema.add_field('value', label='Value', width=1) with group_schema.add_has_many('group_members', GsiGridSchema, label='Members') as sub_schema: sub_schema.add_field('sim_id', label='Sim ID', width=0.35) sub_schema.add_field('sim_name', label='Sim Name', width=0.4) sub_schema.add_field('registered_si', label='Registered SIs') sub_schema.add_field('social_context', label='Social Context') @GsiHandler('social_groups', group_schema) def generate_group_data(): group_data = [] for group in services.social_group_manager().values(): entry = {'type': repr(group), 'count': len(group), 'shutting_down': 'x' if group.has_been_shutdown else '', 'anchor': str(getattr(group, '_anchor', None))} state_info = [] entry['states'] = state_info if group.State is not None: for (state, value) in group.State.items(): state_entry = {'state': str(state), 'value': str(value)} state_info.append(state_entry) members_info = [] entry['group_members'] = members_info
from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.schema import GsiGridSchema from sims4.log import generate_message_with_callstack import services gsi_dump_schema = GsiGridSchema(label='GSI Dump Log') gsi_dump_schema.add_field('game_time', label='Game Time') gsi_dump_schema.add_field('gsi_filename', label='Filename') gsi_dump_schema.add_field('error_log_or_exception', label='Error', width=4) gsi_dump_schema.add_field('callstack', label='Callstack', width=4) gsi_dump_archiver = GameplayArchiver('gsi_dump_log', gsi_dump_schema) def archive_gsi_dump(filename_str, error_str): callstack = generate_message_with_callstack('GSI Dump') archive_data = {'game_time': str(services.game_clock_service().now()), 'gsi_filename': filename_str, 'error_log_or_exception': error_str, 'callstack': callstack} gsi_dump_archiver.archive(data=archive_data)
from builtins import isinstance from alarms import AlarmElement from scheduling import ElementHandle from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema import services timeline_schema = GsiGridSchema(label='Elements') timeline_schema.add_field('line', label='Element') class _Node: __qualname__ = '_Node' def __init__(self, element_handle): self.element_handle = element_handle self.level = 0 @property def index(self): return self.element_handle.ix def __repr__(self): indent = '.'*self.level if self.index is None: return '{}{}'.format(indent, self.element_handle.element.tracing_repr()) return '{}{}:{}'.format(indent, self.element_handle.element.tracing_repr(), self.index) @GsiHandler('sim_timeline_elements', timeline_schema) def create_sim_timeline_data(zone_id:int=None): time_service = services.time_service() if time_service is None: return
self.now = 'Unavailable' self.route_events = {} def get_path_route_events_log(path, clear=False): if path.sim is not None: all_path_logs = setdefault_callable(path_events_archive, path.sim.id, dict) path_log = setdefault_callable(all_path_logs, id(path), PathRouteEventsArchiveGSILog) if clear: del path_events_archive[path.sim.id][id(path)] return path_log route_event_archive_schema = GsiGridSchema(label='Route Event Archive', sim_specific=True) route_event_archive_schema.add_field('game_time', label='GameTime', hidden=True) route_event_archive_schema.add_field('path_type', label='Path Type', width=1) route_event_archive_schema.add_field('duration', label='Duration', type=GsiFieldVisualizers.FLOAT, width=2) route_event_archive_schema.add_field('path_id', label='Path Id', type=GsiFieldVisualizers.INT, width=2) route_event_archive_schema.add_field('master_sim', label='Master Sim', width=2) with route_event_archive_schema.add_has_many('Route Events', GsiGridSchema) as sub_schema:
__qualname__ = 'InteractionArchiveGSILog' def __init__(self): self.clear_log() def clear_log(self): self.status = None self.exit_reason = None self.asms_and_actors = collections.defaultdict(dict) self.participants = [] self.animation_data = [] self.constraints = [] self.exit_reasons = [] self.cancel_callstack = [] interaction_archive_schema = GsiGridSchema(label='Interaction Archive (SI)', sim_specific=True) interaction_archive_schema.add_field('game_time', label='GameTime', hidden=True) interaction_archive_schema.add_field('id', label='ID', hidden=True) interaction_archive_schema.add_field('interaction_id', label='interaction ID', hidden=True) interaction_archive_schema.add_field('sim_name', label='Sim Name', width=150, hidden=True) interaction_archive_schema.add_field('interaction', label='Interaction', width=75) interaction_archive_schema.add_field('target', label='Target', width=30) interaction_archive_schema.add_field('initiator', label='Initiator', width=30) interaction_archive_schema.add_field('duration', label='Duration(Sim Game Time Minutes)', hidden=True) interaction_archive_schema.add_field('status', label='Status', width=65) with interaction_archive_schema.add_has_many('participants', GsiGridSchema) as sub_schema: sub_schema.add_field('ptype', label='PType') sub_schema.add_field('actor', label='Actor') with interaction_archive_schema.add_has_many('asms_and_actors', GsiGridSchema) as sub_schema: sub_schema.add_field('asm', label='ASM') sub_schema.add_field('actor', label='Actor')
from gsi_handlers import gsi_utils from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers from uid import UniqueIdGenerator import services import sims4.reload live_drag_schema = GsiGridSchema(label='Live Drag') live_drag_schema.add_field('live_drag_id', label='ID', type=GsiFieldVisualizers.INT, width=0.5) live_drag_schema.add_field('live_drag_operation', label='Operation', width=1) live_drag_schema.add_field('live_drag_message_type', label='Message Type', width=1) live_drag_schema.add_field('live_drag_from_where', label='From', width=2) live_drag_schema.add_field('live_drag_to_where', label='To', width=2) live_drag_schema.add_field('live_drag_object', label='Object', width=2) live_drag_schema.add_field('live_drag_object_id', label='Object ID', type=GsiFieldVisualizers.INT, hidden=True) live_drag_schema.add_field('live_drag_definition_id', label='Definition ID', type=GsiFieldVisualizers.INT, hidden=True) live_drag_schema.add_field('live_drag_status', label='Can Live Drag', type=GsiFieldVisualizers.STRING, width=1) live_drag_schema.add_field('live_drag_target', label='Drop Target', width=1) live_drag_schema.add_field('live_drag_stack_id', label='Stack ID', type=GsiFieldVisualizers.INT, width=1, hidden=True) live_drag_schema.add_field('live_drag_stack_count', label='Stack Count', type=GsiFieldVisualizers.INT, width=1) live_drag_schema.add_field('live_drag_object_inventory', label='Inventory', width=1) live_drag_archiver = GameplayArchiver('live_drag', live_drag_schema) with sims4.reload.protected(globals()): _live_drag_index = UniqueIdGenerator() def archive_live_drag(op_or_command, message_type, location_from, location_to, live_drag_object=None, live_drag_object_id:int=0, live_drag_target=None): definition_id = 0 stack_id = 0 stack_count = 1 can_live_drag = False current_inventory = None if live_drag_object is None:
from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema import services test_event_schema = GsiGridSchema(label='Event Testing') test_event_schema.add_field('event_enum', label='Enum', unique_field=True, width=1) test_event_schema.add_field('event_name', label='Event Name', width=12) test_event_schema.add_field('custom_key', label='Custom Key', width=15) test_event_schema.add_field('register_count', label='Registered', width=2) test_event_schema.add_field('called_count', label='Called', width=2) test_event_schema.add_field('cost', label='Cost', width=2) test_event_schema.add_field('handlers', label='Handlers', width=20) with test_event_schema.add_has_many('handles', GsiGridSchema, label='Objectives') as sub_schema: sub_schema.add_field('handle', label='Handle') @GsiHandler('test_event_view', test_event_schema) def generate_test_event_view_data(*args, zone_id:int=None, **kwargs): event_mgr = services.get_event_manager() all_events = [] for (key, handlers) in event_mgr._test_event_callback_map.items(): (event_enum, custom_key) = key event_data = {} registered = len(handlers) called = '?' cost = '?' event_data['event_enum'] = int(event_enum) event_data['event_name'] = str(event_enum) event_data['custom_key'] = str(custom_key) event_data['register_count'] = registered event_data['called_count'] = called event_data['cost'] = cost event_data['handlers'] = str(handlers)
import itertools from objects.game_object import GameObject from sims4.gsi.dispatcher import GsiHandler, add_cheat_schema from sims4.gsi.schema import GsiGridSchema, GSIGlobalCheatSchema, GsiFieldVisualizers import gsi_handlers.gsi_utils import services import sims4 import build_buy lot_info_schema = GsiGridSchema(label='Lot Info', auto_refresh=False) lot_info_schema.add_field('neighborhood', label='Neighborhood', unique_field=True) lot_info_schema.add_field('cur_lot', label='Current Lot', width=0.4) lot_info_schema.add_field('region_id', label='Region ID', type=GsiFieldVisualizers.INT, width=0.5) lot_info_schema.add_field('lot_desc_id', label='Description ID', type=GsiFieldVisualizers.INT, width=0.5) lot_info_schema.add_field('zone_id', label='Zone ID', type=GsiFieldVisualizers.INT) lot_info_schema.add_field('venue_type', label='Venue Type') lot_info_schema.add_field('lot_name', label='Lot Name') @GsiHandler('lot_info', lot_info_schema) def generate_lot_info_data(*args, zone_id:int=None, filter=None, **kwargs): lot_infos = [] current_zone = services.current_zone() lot = current_zone.lot neighborhood_id = current_zone.neighborhood_id lot_description_id = services.get_lot_description_id(lot.lot_id) world_description_id = services.get_world_description_id(current_zone.world_id) neighborhood_description_id = services.get_persistence_service().get_neighborhood_proto_buff(neighborhood_id).region_id venue_manager = services.get_instance_manager(sims4.resources.Types.VENUE) for neighborhood_proto in services.get_persistence_service().get_neighborhoods_proto_buf_gen(): for lot_owner_info in neighborhood_proto.lots: zone_id = lot_owner_info.zone_instance_id while zone_id is not None:
from sims4.gsi.schema import GsiGridSchema from gsi_handlers.gameplay_archiver import GameplayArchiver mc_archive_schema = GsiGridSchema(label='Master Controller Log') mc_archive_schema.add_field('sims_with_active_work', label='Sims With Active Work Start', width=2) mc_archive_schema.add_field('sims_with_active_work_after', label='Sims With Work After', width=2) mc_archive_schema.add_field('last_time_stamp', label='Time Stamp At Start', width=2) mc_archive_schema.add_field('last_time_stamp_end', label='Time Stamp At End', width=2) with mc_archive_schema.add_has_many('Log', GsiGridSchema) as sub_schema: sub_schema.add_field('tag', label='Tag', width=0.25) sub_schema.add_field('sim', label='Sim', width=0.15) sub_schema.add_field('log', label='log') with mc_archive_schema.add_has_many('active_work_start', GsiGridSchema) as sub_schema: sub_schema.add_field('sim', label='ID', width=0.2) sub_schema.add_field('work_entry', label='Work') with mc_archive_schema.add_has_many('active_work_end', GsiGridSchema) as sub_schema: sub_schema.add_field('sim', label='ID', width=0.2) sub_schema.add_field('work_entry', label='Work') archiver = GameplayArchiver('master_controller', mc_archive_schema, add_to_archive_enable_functions=False) def archive_master_controller_entry(entry): archiver.archive(data=entry)
from display_snippet_tuning import Organization from organizations.organization_enums import OrganizationStatusEnum from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema import services organization_schema = GsiGridSchema(label='Organizations', auto_refresh=False) organization_schema.add_field('organization', label='Organization') with organization_schema.add_has_many('active_members', GsiGridSchema, label='Active Members') as sub_schema: sub_schema.add_field('sim', label='Sim') sub_schema.add_field('progress', label='Progress') sub_schema.add_field('rank', label='Rank') with organization_schema.add_has_many('inactive_members', GsiGridSchema, label='Inactive Members') as sub_schema: sub_schema.add_field('sim', label='Sim') sub_schema.add_field('progress', label='Progress') sub_schema.add_field('rank', label='Rank') def get_organization_members(org_id, status_enum): organization_member_data = [] organization_service = services.organization_service() if organization_service is None: return organization_member_data sim_info_manager = services.sim_info_manager() if sim_info_manager is None: return snippet_manager = services.snippet_manager() if snippet_manager is None: return progress_stat_type = snippet_manager.get(org_id).progress_statistic members_list = organization_service.get_organization_members(org_id) for member_id in members_list: sim_info = sim_info_manager.get(member_id)
from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers import services from protocolbuffers import Sims_pb2 sim_buff_log_schema = GsiGridSchema(label='Buffs Log', sim_specific=True) sim_buff_log_schema.add_field('buff_id', label='Buff ID', type=GsiFieldVisualizers.INT, width=0.5) sim_buff_log_schema.add_field('buff_name', label='Name', width=2) sim_buff_log_schema.add_field('equipped', label='Equip', width=1) sim_buff_log_schema.add_field('buff_reason', label='Reason', width=1) sim_buff_log_schema.add_field('timeout', label='Timeout', width=2) sim_buff_log_schema.add_field('rate', label='Rate', width=2) sim_buff_log_schema.add_field('is_mood_buff', label='Is Mood Buff', width=2) sim_buff_log_schema.add_field('progress_arrow', label='Progress Arrow', width=2) sim_buff_log_schema.add_field('commodity_guid', label='Commodity Guid', type=GsiFieldVisualizers.INT, hidden=True) sim_buff_log_schema.add_field('transition_into_buff_id', label='Next Buff ID', type=GsiFieldVisualizers.INT, hidden=True) sim_buff_log_archiver = GameplayArchiver('sim_buff_log', sim_buff_log_schema) def archive_buff_message(buff_msg, shows_timeout, change_rate): buff_reason = hex(buff_msg.reason.hash) if buff_msg.HasField('reason') else None entry = {'buff_id': buff_msg.buff_id, 'equipped': buff_msg.equipped, 'buff_reason': buff_reason, 'is_mood_buff': buff_msg.is_mood_buff, 'commodity_guid': buff_msg.commodity_guid, 'transition_into_buff_id': buff_msg.transition_into_buff_id} manager = services.buff_manager() if manager: buff_cls = manager.get(buff_msg.buff_id) entry['buff_name'] = buff_cls.__name__ if buff_msg.timeout: entry['timeout'] = buff_msg.timeout entry['rate'] = buff_msg.rate_multiplier if buff_msg.equipped and shows_timeout and change_rate is not None: if buff_msg.buff_progress == Sims_pb2.BUFF_PROGRESS_NONE: entry['progress_arrow'] = 'No Arrow' elif buff_msg.buff_progress == Sims_pb2.BUFF_PROGRESS_UP:
from sims.bills_enums import UtilityEndOfBillAction from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers from sims4.resources import Types from event_testing.resolver import SingleSimResolver from gsi_handlers.gsi_utils import format_enum_name from sims.bills import Bills from sims.household_utilities.utility_types import Utilities import services import world.street household_archive_schema = GsiGridSchema(label='Household Archive', sim_specific=False) household_archive_schema.add_field('name', label='Name', type=GsiFieldVisualizers.STRING) household_archive_schema.add_field('hidden', label='Hidden', type=GsiFieldVisualizers.STRING) household_archive_schema.add_field('player', label='Player', type=GsiFieldVisualizers.STRING) household_archive_schema.add_field('played', label='Played', type=GsiFieldVisualizers.STRING) household_archive_schema.add_field('num_sims', label='Sim Count', type=GsiFieldVisualizers.INT) household_archive_schema.add_field('region', label='World', type=GsiFieldVisualizers.STRING) household_archive_schema.add_field('street', label='Street', type=GsiFieldVisualizers.STRING) household_archive_schema.add_field('zone_name', label='Lot', type=GsiFieldVisualizers.STRING) household_archive_schema.add_field('funds', label='Funds', type=GsiFieldVisualizers.INT) household_archive_schema.add_field('net_worth', label='Net Worth', type=GsiFieldVisualizers.INT) household_archive_schema.add_field('region_id', label='Region ID', type=GsiFieldVisualizers.INT) household_archive_schema.add_field('home_zone_id', label='Home Zone ID', type=GsiFieldVisualizers.STRING) household_archive_schema.add_field('household_id', label='Household ID', type=GsiFieldVisualizers.STRING, unique_field=True) household_archive_schema.add_field('premade_household_id', label='Premade Household ID', type=GsiFieldVisualizers.STRING) household_archive_schema.add_field('move_in_time', label='Home Zone Move In Time', type=GsiFieldVisualizers.STRING) with household_archive_schema.add_has_many('sim_infos', GsiGridSchema) as sub_schema: sub_schema.add_field('sim_id', label='Sim_Id', type=GsiFieldVisualizers.INT) sub_schema.add_field('sim_name', label='Name', type=GsiFieldVisualizers.STRING) sub_schema.add_field('species', label='Species', type=GsiFieldVisualizers.STRING) sub_schema.add_field('gender', label='Gender', type=GsiFieldVisualizers.STRING)
from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers content_set_archive_schema = GsiGridSchema(label='Content Set Generation', sim_specific=True) content_set_archive_schema.add_field('sim', label='Sim', width=2) content_set_archive_schema.add_field('super_interaction', label='Super Interaction', width=2) content_set_archive_schema.add_field('considered_count', label='Considered', type=GsiFieldVisualizers.INT, width=1) content_set_archive_schema.add_field('result_count', label='Results', width=1) content_set_archive_schema.add_field('topics', label='Topics', width=1) with content_set_archive_schema.add_has_many('Considered', GsiGridSchema) as sub_schema: sub_schema.add_field('selected', label='Selected', width=1) sub_schema.add_field('eligible', label='Eligible', width=2) sub_schema.add_field('affordance', label='Affordance', width=3) sub_schema.add_field('target', label='Target', width=3) sub_schema.add_field('test', label='Test Result', width=2) sub_schema.add_field('base_score', label='Base Score', type=GsiFieldVisualizers.INT, width=1) sub_schema.add_field('buff_score_adjustment', label='Buff Score', type=GsiFieldVisualizers.INT, width=1) sub_schema.add_field('topic_score', label='Topic Score', type=GsiFieldVisualizers.INT, width=1) sub_schema.add_field('score_modifier', label='Score Modifier', type=GsiFieldVisualizers.INT, width=1) sub_schema.add_field('total_score', label='Total Score', type=GsiFieldVisualizers.INT, width=1) with content_set_archive_schema.add_has_many('Results', GsiGridSchema) as sub_schema: sub_schema.add_field('result_affordance', label='Affordance', width=3) sub_schema.add_field('result_target', label='Target', width=3) sub_schema.add_field('result_loc_key', label='Localization Key', width=3) sub_schema.add_field('result_target_loc_key', label='Target Loc Key', width=3) archiver = GameplayArchiver('content_set', content_set_archive_schema) def archive_content_set(sim, si, considered, results, topics): entry = {} entry['sim'] = str(sim) entry['super_interaction'] = str(si) entry['considered_count'] = len(considered)
from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiFieldVisualizers, GsiGridSchema import autonomy.autonomy_modes import services autonomy_archive_schema = GsiGridSchema(label='Autonomy Log', sim_specific=True) autonomy_archive_schema.add_field('sim_name', label='Sim Name', width=2) autonomy_archive_schema.add_field('result', label='Result', width=5) autonomy_archive_schema.add_field('type', label='Type', width=2) with autonomy_archive_schema.add_has_many('Affordances', GsiGridSchema) as sub_schema: sub_schema.add_field('affordance', label='Affordance', width=3) sub_schema.add_field('target', label='Target', width=2) sub_schema.add_field('affordance_status', label='Status', width=5) sub_schema.add_field('autonomy_stage', label='Stage', width=2) sub_schema.add_field('affordance_score', label='Score', type=GsiFieldVisualizers.FLOAT, width=1) sub_schema.add_field('multitask_percentage', label='Multitask %', type=GsiFieldVisualizers.FLOAT, width=1) sub_schema.add_field('scoring_priority', label='Scoring Priority', width=2) sub_schema.add_field('affordance_relevant_desires', label='Relevant Desires', width=4) sub_schema.add_field('affordance_details', label='Details', width=6) with autonomy_archive_schema.add_has_many('Probability', GsiGridSchema) as sub_schema:
from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers import alarms alarm_schema = GsiGridSchema(label='Alarms') alarm_schema.add_field('time', label='Absolute Time', width=2) alarm_schema.add_field('time_left', label='Time Left', width=1) alarm_schema.add_field('ticks', label='Ticks Left', type=GsiFieldVisualizers.INT) alarm_schema.add_field('handle', label='Handle', width=1, unique_field=True, hidden=True) alarm_schema.add_field('owner', label='Owner', width=3) alarm_schema.add_field('callback', label='Callback', width=3) @GsiHandler('alarms', alarm_schema) def generate_alarm_data(*args, zone_id:int=None, **kwargs): return alarms.get_alarm_data_for_gsi()
from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema import services global_policy_archive_schema = GsiGridSchema(label='Global Policy Log', auto_refresh=True) global_policy_archive_schema.add_field('policy', label='Global Policy') global_policy_archive_schema.add_field('progress_value', label='Progress Value') global_policy_archive_schema.add_field('decay_days', label='Decay Days') global_policy_archive_schema.add_field('progress_state', label='Progress State') @GsiHandler('global_policy_log', global_policy_archive_schema) def generate_global_policy_data(): policy_data = [] for policy in services.global_policy_service().get_global_policies(): entry = { 'policy': repr(policy).split('sims4.tuning.instances.', 1)[1].split('object', 1)[0], 'progress_value': str(policy.progress_value) + '/' + str(policy.progress_max_value), 'decay_days': 0 if policy.decay_handler is None or policy.decay_handler.when is None else str(policy.decay_handler.when - services.time_service().sim_now), 'progress_state': str(policy.progress_state) } policy_data.append(entry)
'oddjob' ] def drama_node_string_matches_filters(drama_node_string, filter_list): if filter_list is None: return True drama_node_string = drama_node_string.lower() if NONPICKERDRAMANODES_DRAMA_NODES_FILTER in filter_list and PICKER_DRAMA_NODE_SUBSTRING not in drama_node_string: return True elif any(a_filter in drama_node_string for a_filter in filter_list): return True return False drama_schema = GsiGridSchema(label='Drama Nodes/Drama Scheduler') drama_schema.add_field('drama_node_id', label='Drama Node Id', unique_field=True) drama_schema.add_field('drama_node', label='Drama Node', width=3) drama_schema.add_field('status', label='Status', width=3) drama_schema.add_field('time_left', label='Time Left') drama_schema.add_field('receiver_sim', label='Receiver Sim') drama_schema.add_field('sender_sim', label='Sender Sim') for filter_string in FILTER_STRINGS: drama_schema.add_filter(filter_string) @GsiHandler('drama', drama_schema) def generate_drama_scheduler_data(zone_id: int = None, filter=None): all_nodes = []
class SimFilterGSILoggingData: def __init__(self, request_type, sim_filter_type, gsi_source_fn): self.request_type = request_type self.sim_filter_type = sim_filter_type if gsi_source_fn is None: logger.warn( '{} filter request for {} did not specify a gsi_source_fn. Please make sure the filter request is provided with this argument.', request_type, sim_filter_type) self.gsi_source_fn = gsi_source_fn self.filters = {} def add_filter(self, filter_term, score): self.filters[filter_term] = score sim_filter_archive_schema = GsiGridSchema(label='Sim Filter Archive', sim_specific=True) sim_filter_archive_schema.add_field('sim_id', label='simID', type=GsiFieldVisualizers.INT, hidden=True) sim_filter_archive_schema.add_field('source', label='Source', width=3) sim_filter_archive_schema.add_field('request_type', label='Request Type') sim_filter_archive_schema.add_field('filter_type', label='Filter Type', width=2.5) sim_filter_archive_schema.add_field('rejected', label='Is Rejected', width=1) sim_filter_archive_schema.add_field('reason', label='Reason', width=1) with sim_filter_archive_schema.add_has_many('Filter Breakdown', GsiGridSchema) as sub_schema: sub_schema.add_field('filter', label='Filter', width=1) sub_schema.add_field('score', label='Score', width=1)
from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.schema import GsiGridSchema import gsi_handlers state_trigger_schema = GsiGridSchema(label='State Triggers/State Trigger Log') state_trigger_schema.add_field('objId', label='Object Id', unique_field=True, width=1.2) state_trigger_schema.add_field('def', label='Definition', width=2) state_trigger_schema.add_field('parent', label='Parent', width=1.5) state_trigger_schema.add_field('state', label='Trigger State', width=1.5) state_trigger_schema.add_field('state_value', label='Trigger State Value', width=2) state_trigger_schema.add_field('at_state', label='Triggered At State', width=2.5) state_trigger_schema.add_field('at_states', label='At States', width=2.5) state_trigger_schema.add_field('src', label='Source', width=1.3) state_trigger_archiver = GameplayArchiver('StateTriggerLog', state_trigger_schema) def archive_state_trigger(obj, triggered_state, at_state, at_states, source=''): archive_data = {'objId': hex(obj.id), 'def': obj.definition.name, 'state': str(triggered_state.state), 'state_value': str(triggered_state), 'at_state': str(at_state), 'at_states': str(at_states), 'src': source} if obj.parent is not None: archive_data['parent'] = gsi_handlers.gsi_utils.format_object_name(obj.parent) state_trigger_archiver.archive(data=archive_data) timed_state_trigger_schema = GsiGridSchema(label='State Triggers/Timed State Trigger Log') timed_state_trigger_schema.add_field('objId', label='Object Id', unique_field=True) timed_state_trigger_schema.add_field('def', label='Definition', width=2) timed_state_trigger_schema.add_field('state', label='Trigger State', width=2) timed_state_trigger_schema.add_field('state_value', label='Trigger State Value', width=2) timed_state_trigger_schema.add_field('at_state', label='At State', width=2) timed_state_trigger_schema.add_field('trigger_time', label='Trigger Time') timed_state_trigger_archiver = GameplayArchiver('TimedStateTriggerLog', timed_state_trigger_schema) def archive_timed_state_trigger(obj, triggered_state, at_state, trigger_time): archive_data = {'objId': hex(obj.id), 'def': obj.definition.name, 'state': str(triggered_state.state), 'state_value': str(triggered_state), 'at_state': str(at_state), 'trigger_time': trigger_time}
from collections import namedtuple from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers import services relationship_culling_archive_schema = GsiGridSchema( label='Relationship Culling Archive', sim_specific=False) relationship_culling_archive_schema.add_field('game_time', label='Game/Sim Time', type=GsiFieldVisualizers.TIME) relationship_culling_archive_schema.add_field('relationships_culled', label='Relationships Culled', type=GsiFieldVisualizers.INT) with relationship_culling_archive_schema.add_has_many( 'all_relationships', GsiGridSchema) as sub_schema: sub_schema.add_field('culled_status', label='Culled Status') sub_schema.add_field('culled_reason', label='Culled Reason') sub_schema.add_field('sim_info', label='Sim A') sub_schema.add_field('target_sim_info', label='Sim B') sub_schema.add_field('total_depth', label='Total Depth', type=GsiFieldVisualizers.INT, width=0.2) sub_schema.add_field('rel_bits', label='Relationship Bits') with relationship_culling_archive_schema.add_has_many( 'not_culled_relationships', GsiGridSchema) as sub_schema: sub_schema.add_field('culled_status', label='Culled Status') sub_schema.add_field('culled_reason', label='Culled Reason') sub_schema.add_field('sim_info', label='Sim A') sub_schema.add_field('target_sim_info', label='Sim B') sub_schema.add_field('total_depth',
from performance.object_leak_tracker import NodeStatus from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema import services schema = GsiGridSchema(label='Object Leaks') schema.add_field('status', label='Status') schema.add_field('pid', label='Python Id', unique_field=True) schema.add_field('pid_hex', label='Python Id (hex)') schema.add_field('type', label='Type') schema.add_field('old_manager', label='Old Manager') schema.add_field('old_obj_id', label='Old Object Id') with schema.add_has_many('history', GsiGridSchema) as sub_schema: sub_schema.add_field('status', label='Status') sub_schema.add_field('gc_pass', label='GC Pass') sub_schema.add_field('time', label='Time') schema.add_view_cheat('mem.gc.collect', label='|mem.gc.collect') with schema.add_view_cheat( 'object_leak_tracker.dump_pid', label='|object_leak_tracker.dump_pid <python id>') as cheat: cheat.add_token_param('pid') @GsiHandler('leaked_objects', schema) def generate_data(*args, **kwargs): data = [] tracker = services.get_object_leak_tracker() if tracker is None: return data for status in NodeStatus: for node in tracker.buckets[status]: node_data = {}
from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers from tag import Tag import services schema = GsiGridSchema(label='Spawn Points') schema.add_field('id', label='id', unique_field=True, width=2, type=GsiFieldVisualizers.STRING) schema.add_field('name', label='name', type=GsiFieldVisualizers.STRING, width=3) schema.add_field('x', label='x', type=GsiFieldVisualizers.FLOAT, width=2) schema.add_field('y', label='y', type=GsiFieldVisualizers.FLOAT, width=2) schema.add_field('z', label='z', type=GsiFieldVisualizers.FLOAT, width=2) schema.add_field('lot_id', label='lot_id', type=GsiFieldVisualizers.INT, width=3) schema.add_field('tags', label='tags', type=GsiFieldVisualizers.STRING, width=4) schema.add_view_cheat('debugvis.spawn_points.start', label='Start Visualization') schema.add_view_cheat('debugvis.spawn_points.stop', label='Stop Visualization') with schema.add_cheat('camera.focus_on_position', label='Focus', dbl_click=True) as cheat:
'filter_term': str(filter_term) }) def add_metadata(self, num_sims, allow_instanced_sims, club, blacklist_sims, optional): if len(blacklist_sims): blacklist_sims = str(blacklist_sims) else: blacklist_sims = None self.metadata = [ num_sims, allow_instanced_sims, str(club), blacklist_sims, optional ] sim_filter_service_archive_schema = GsiGridSchema( label='Sim Filter Service Archive') sim_filter_service_archive_schema.add_field('game_time', label='Game Time', type=GsiFieldVisualizers.TIME) sim_filter_service_archive_schema.add_field('source', label='Source', width=3) sim_filter_service_archive_schema.add_field('request_type', label='Request Type') sim_filter_service_archive_schema.add_field('yielding', label='Yielding') sim_filter_service_archive_schema.add_field('matching_results', label='Num Matching', type=GsiFieldVisualizers.INT) sim_filter_service_archive_schema.add_field('created_sims', label='Num Created', type=GsiFieldVisualizers.INT) sim_filter_service_archive_schema.add_field('filter_type', label='Filter Type',
class InteractionArchiveGSILog: def __init__(self): self.clear_log() def clear_log(self): self.status = None self.exit_reason = None self.asms_and_actors = collections.defaultdict(dict) self.participants = [] self.animation_data = [] self.constraints = [] self.exit_reasons = [] self.cancel_callstack = [] interaction_archive_schema = GsiGridSchema(label='Interaction Archive (SI)', sim_specific=True) interaction_archive_schema.add_field('game_time', label='GameTime', hidden=True) interaction_archive_schema.add_field('archive_id', label='ID', hidden=True) interaction_archive_schema.add_field('interaction_id', label='interaction ID', hidden=True) interaction_archive_schema.add_field('sim_name', label='Sim Name', width=150, hidden=True) interaction_archive_schema.add_field('interaction', label='Interaction', width=75) interaction_archive_schema.add_field('target', label='Target', width=30)
from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers balloon_archive_schema = GsiGridSchema(label='Balloons', sim_specific=True) balloon_archive_schema.add_field('sim', label='Sim', width=2) balloon_archive_schema.add_field('interaction', label='Interaction', width=2) balloon_archive_schema.add_field('balloon_type', label='Type', width=2) balloon_archive_schema.add_field('icon', label='Icon', width=2) balloon_archive_schema.add_field('balloon_category', label='Category', width=2) balloon_archive_schema.add_field('weight', label='Weight', type=GsiFieldVisualizers.INT, width=1) balloon_archive_schema.add_field('total_weight', label='Total Weight', type=GsiFieldVisualizers.INT, width=1) with balloon_archive_schema.add_has_many('Considered', GsiGridSchema) as sub_schema: sub_schema.add_field('test_result', label='Test Result', width=2) sub_schema.add_field('balloon_type', label='Type', width=2) sub_schema.add_field('icon', label='Icon', width=2) sub_schema.add_field('weight', label='Weight', type=GsiFieldVisualizers.INT, width=1) sub_schema.add_field('balloon_category', label='Category', width=2) archiver = GameplayArchiver('balloon', balloon_archive_schema) def archive_balloon_data(sim, interaction, result, icon, entries): if result is not None: weight = result.weight balloon_type = str(result.balloon_type) gsi_category = result.gsi_category else: weight = 0 balloon_type = 'None' gsi_category = 'None' entry = {} entry['sim'] = str(sim) entry['interaction'] = str(interaction) entry['weight'] = weight
from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.schema import GsiFieldVisualizers, GsiGridSchema import gsi_handlers import services skill_change_log_archive_schema = GsiGridSchema(label='Skill Change Log', sim_specific=True) skill_change_log_archive_schema.add_field('skill_name', label='Skill Name', width=3) skill_change_log_archive_schema.add_field('current_game_time', label='Game Time', width=1.5) skill_change_log_archive_schema.add_field('old_skill_value', label='Old Value', type=GsiFieldVisualizers.FLOAT) skill_change_log_archive_schema.add_field('new_skill_value', label='New Value', type=GsiFieldVisualizers.FLOAT) skill_change_log_archive_schema.add_field('new_level', label='New Level', type=GsiFieldVisualizers.INT) skill_change_log_archive_schema.add_field('time_delta', label='Time Change', type=GsiFieldVisualizers.INT) skill_change_log_archive_schema.add_field('skill_delta', label='Skill Per Min', type=GsiFieldVisualizers.INT) skill_change_archiver = GameplayArchiver('skill_change_log', skill_change_log_archive_schema, add_to_archive_enable_functions=True) def archive_skill_change(sim, skill, time_delta, old_skill_value, new_skill_value, new_level, last_update): if time_delta != 0: skill_per_time = (new_skill_value - old_skill_value)/time_delta else: skill_per_time = 0 archive_data = {'skill_name': skill.skill_type.__name__, 'current_game_time': str(services.time_service().sim_now), 'old_skill_value': old_skill_value, 'new_skill_value': new_skill_value, 'new_level': new_level, 'time_delta': str(time_delta), 'skill_delta': skill_per_time} skill_change_archiver.archive(data=archive_data, object_id=sim.id) environment_score_archive_schema = GsiGridSchema(label='Environment Score Log', sim_specific=True) environment_score_archive_schema.add_field('primary_mood', label='Primary Mood') environment_score_archive_schema.add_field('score', label='Total Mood Score', type=GsiFieldVisualizers.FLOAT) environment_score_archive_schema.add_field('mood_commodity', label='Mood Commodity') environment_score_archive_schema.add_field('negative_score', label='Total Negative Score', type=GsiFieldVisualizers.FLOAT) environment_score_archive_schema.add_field('negative_commodity', label='Negative Commodity') environment_score_archive_schema.add_field('positive_score', label='Total Positive Score', type=GsiFieldVisualizers.FLOAT) environment_score_archive_schema.add_field('positive_commodity', label='Positive Commodity') with environment_score_archive_schema.add_has_many('contributing_objects', GsiGridSchema, label='Contributing Objects') as sub_schema:
from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.schema import GsiGridSchema import services from services import venue_service zone_director_schema = GsiGridSchema(label='Zone Director') zone_director_schema.add_field('zone_director_type', label='Zone Director Type') zone_director_schema.add_field('zone_id', label='Zone Id') zone_director_schema.add_field('op', label='Op') zone_director_schema.add_field('neighborhood', label='Neighborhood') zone_director_schema.add_field('lot_id', label='Lot Id') zone_director_schema.add_field('active_venue', label='Venue') zone_director_schema.add_field('source_venue', label='Source Venue') with zone_director_schema.add_has_many('lot preparations', GsiGridSchema) as sub_schema: sub_schema.add_field('action', label='Action') sub_schema.add_field('description', label='Description') with zone_director_schema.add_has_many('spawn objects', GsiGridSchema) as sub_schema: sub_schema.add_field('obj_id', label='Obj Id') sub_schema.add_field('obj_def', label='Obj Def') sub_schema.add_field('parent_id', label='Parent Id') sub_schema.add_field('position', label='Position') sub_schema.add_field('states', label='States') with zone_director_schema.add_has_many('civic_policies', GsiGridSchema, label='Civic Policies') as sub_schema: sub_schema.add_field('civic_policy', label='Civic Policy') sub_schema.add_field('enacted', label='Enacted') sub_schema.add_field('votes', label='Votes') archiver = GameplayArchiver('zone_director',
from gsi_handlers import gsi_utils from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.schema import GsiGridSchema, GsiFieldVisualizers from uid import UniqueIdGenerator import services import sims4.reload live_drag_schema = GsiGridSchema(label='Live Drag') live_drag_schema.add_field('live_drag_id', label='ID', type=GsiFieldVisualizers.INT, width=0.5) live_drag_schema.add_field('live_drag_operation', label='Operation', width=1) live_drag_schema.add_field('live_drag_message_type', label='Message Type', width=1) live_drag_schema.add_field('live_drag_from_where', label='From', width=2) live_drag_schema.add_field('live_drag_to_where', label='To', width=2) live_drag_schema.add_field('live_drag_object', label='Object', width=2) live_drag_schema.add_field('live_drag_object_id', label='Object ID', type=GsiFieldVisualizers.INT, hidden=True) live_drag_schema.add_field('live_drag_definition_id', label='Definition ID', type=GsiFieldVisualizers.INT, hidden=True) live_drag_schema.add_field('live_drag_status', label='Can Live Drag', type=GsiFieldVisualizers.STRING, width=1) live_drag_schema.add_field('live_drag_target', label='Drop Target', width=1)
from gsi_handlers.gameplay_archiver import GameplayArchiver from sims4.gsi.dispatcher import GsiHandler from sims4.gsi.schema import GsiGridSchema import gsi_handlers import services import sims4.resources achievement_schema = GsiGridSchema(label='Achievements', sim_specific=True) achievement_schema.add_field('achievement_uid', label='UId', unique_field=True) achievement_schema.add_field('achievement', label='Achievement', width=3) achievement_schema.add_field('category', label='Category', width=2) achievement_schema.add_field('points', label='Points') achievement_schema.add_field('achievement_complete', label='Done') achievement_schema.add_field('display_name', label='DisplayStr', hidden=True) achievement_schema.add_field('description', label='DescStr', hidden=True) achievement_schema.add_field('simId', label='SimId', hidden=True) with achievement_schema.add_view_cheat('achievements.complete_achievement', label='Complete') as cheat: cheat.add_token_param('achievement_uid') cheat.add_token_param('simId') with achievement_schema.add_has_many('objectives', GsiGridSchema, label='Objectives') as sub_schema: sub_schema.add_field('objective', label='Objective') sub_schema.add_field('objective_complete', label='Done') @GsiHandler('achievement_view', achievement_schema) def generate_achievement_view_data(sim_id:int=None): sim_info = services.sim_info_manager().get(sim_id) achievement_manager = services.get_instance_manager(sims4.resources.Types.ACHIEVEMENT) all_achievements = [] for achievement_id in achievement_manager.types: achievement = achievement_manager.get(achievement_id) achievement_data = {} achievement_data['achievement'] = str(achievement)