§
    *ÛÀjá  ã                  óÒ   — d Z ddlmZ ddlZddlmZmZmZmZ 	 ddl	m
Z
mZ ddlmZ ddlmZ ddlmZ n%# e$ r ddlm
Z
mZ ddlmZ ddlmZ ddlmZ Y nw xY w G d	„ d
¦  «        ZdS )a+  
Server-Authoritative Gateway Synchronization Helper for FreeExile.
Coordinates zone monster streaming from WildernessEncounterEngine and
quest state synchronization from QuestEngine over WebSocket connections.
Zero-Trust Server Authority: Server is the sole source of truth for stats and progress.
é    )ÚannotationsN)ÚAnyÚDictÚListÚOptional)ÚMonsterGenusÚMonsterRank)Ú(register_canonical_quests_and_milestones)ÚQuestEngine)ÚWildernessEncounterEnginec                  ó<   — e Zd ZdZ	 	 ddd	„Z	 ddd„Zdd„Zdd„ZdS )ÚGatewaySyncHelperzUManages authoritative zone monster distribution and quest progression for WS clients.NÚencounter_engineú#Optional[WildernessEncounterEngine]Úquest_engineúOptional[QuestEngine]ÚreturnÚNonec                ó”   — |pt          ¦   «         | _        |�	|| _        d S t          ¦   «         | _        t	          | j        ¦  «         d S )N)r   r   r   r   r
   )Úselfr   r   s      ú;C:\Projects\FreeExile\server\gateway\gateway_sync_helper.pyÚ__init__zGatewaySyncHelper.__init__   sO   € ð
 !1Ð OÕ4MÑ4OÔ4OˆÔØÐ#Ø ,ˆDÔÐÐå +¡¤ˆDÔÝ4°TÔ5FÑGÔGÐGÐGÐGó    éè  Úzone_idÚstrÚseedÚintúDict[str, Any]c                ó$  — | j                              ||¬¦  «        }g }|D �]Ó}|j        }t          |j        d¦  «        r|j        j        nt          |j        ¦  «        }t          |j        d¦  «        r|j        j        nt          |j        ¦  «        }|                     d|j	        › d�|j        |t          |j        d¦  «        t          |j        d¦  «        |j        |j        |j        ||j        |j        t           j        k    dœ¦  «         | j         j                             |¦  «        }	t)          |	¦  «        D ]´\  }
}|j        rŒ|j        }t          |j        d¦  «        r|j        j        nt          |j        ¦  «        }|                     d|j	        › d|
› �|j        |t          |j        d¦  «        t          |j        d¦  «        |j        |j        |j        d|j        d	dœ¦  «         Œµ�ŒÕd
||dt3          j        ¦   «         dz  dœS )z>Generates authoritative monster states for the requested zone.)r   r   ÚnameÚsrv_Ú_leadé   )Úidr!   ÚgenusÚwxÚwyÚmax_hpÚhpÚ
attack_dmgÚrankÚlevelÚis_bossÚ_mÚCOMMONFÚzone_monsters_syncTr   )Útyper   ÚmonstersÚauthoritativeÚ	timestamp)r   Úgenerate_zone_encounter_packsÚleaderÚhasattrr&   r!   r   r,   ÚappendÚpack_idÚroundÚcenter_xÚcenter_yr)   Úbase_damager-   r	   ÚBOSSÚprocedural_engineÚcreate_pack_runtime_statesÚ	enumerateÚis_pack_leaderÚmonsterÚ	current_xÚ	current_yÚtime)r   r   r   Úpacksr3   Úpackr7   Ú
genus_nameÚ	rank_nameÚstatesÚidxÚstÚminionÚm_genuss                 r   Úgenerate_zone_monsters_payloadz0GatewaySyncHelper.generate_zone_monsters_payload(   sS  € ð Ô%×CÒCØ $ð Dñ 
ô 
ˆð *,ˆàð 6	ñ 6	ˆDà”[ˆFõ ˜6œ<¨Ñ0Ô0ð'�”Ô!Ð!å˜œÑ&Ô&ð õ %,¨F¬K¸Ñ$@Ô$@ÐV�”Ô Ð ÅcÈ&Ì+ÑFVÔFVð ð �OŠOà4 ¤Ð4Ð4Ð4Ø"œKØ'Ý ¤¨qÑ1Ô1Ý ¤¨qÑ1Ô1Ø$œmØ œ-Ø"(Ô"4Ø%Ø#œ\Ø &¤­{Ô/?Ò ?ðð ñô ð ð" Ô*Ô<×WÒWØñô ˆFõ % VÑ,Ô,ð ð ‘��RØÔ$ð ØØœ�õ ˜vœ|¨VÑ4Ô4ð+�F”LÔ%Ð%å˜Vœ\Ñ*Ô*ð ð
 —’à: T¤\Ð:Ð:°SÐ:Ð:Ø &¤Ø!(Ý# B¤L°!Ñ4Ô4Ý# B¤L°!Ñ4Ô4Ø"(¤-Ø$œmØ&,Ô&8Ø (Ø!'¤Ø#(ðð ñô ð ð ñð4 )ØØ Ø!Ýœ™œ tÑ+ð
ð 
ð 	
r   Ú	player_idc           
     ó6  — | j                              |d¦  «         | j         j                             |i ¦  «        }|s<| j                              |dd¦  «         | j         j                             |i ¦  «        }t          |                     ¦   «         ¦  «        }g }|D ]ß}| j                              |j        ¦  «        }g }|j	                             ¦   «         D ]6}| 
                    |j        |j        |j        |j        |j        dœ¦  «         Œ7t!          |j        d¦  «        r|j        j        nt'          |j        ¦  «        }	| 
                    |j        |r|j        n|j        |r|j        nd|	|dœ¦  «         Œàd||dt+          j        ¦   «         d	z  d
œS )z9Returns authoritative active quest progress for a player.é   Ú!quest_norm_01_thuc_tinh_tang_kiem)r%   ÚdescÚcurrentÚrequiredÚis_completedÚvalueÚ )Úquest_idÚtitleÚdescriptionÚstatusÚ
objectivesÚ
quest_syncTr   )r2   rR   Úquestsr4   r5   )r   Úinitialize_playerÚ_player_questsÚgetÚaccept_questÚlistÚvaluesÚget_quest_definitionr\   r`   r9   Úobjective_idr^   Úcurrent_countÚtarget_countrY   r8   r_   rZ   r   r]   rG   )
r   rR   Úplayer_dictÚ
all_questsÚ
quest_listÚqÚq_defÚobjsÚoÚ
status_vals
             r   Úget_player_quests_payloadz+GatewaySyncHelper.get_player_quests_payloadq   sÎ  € àÔ×+Ò+¨I°qÑ9Ô9Ð9ØÔ'Ô6×:Ò:¸9ÀbÑIÔIˆØð 	NØÔ×*Ò*ØÐ>Àñô ð ð Ô+Ô:×>Ò>¸yÈ"ÑMÔMˆKå˜+×,Ò,Ñ.Ô.Ñ/Ô/ˆ
Ø+-ˆ
Øð 	ð 	ˆAØÔ%×:Ò:¸1¼:ÑFÔFˆEØˆDØ”\×(Ò(Ñ*Ô*ð 	ð 	�Ø—’àœnØ !¤Ø#$¤?Ø$%¤NØ()¬ðð ñô ð ð õ #*¨!¬(°GÑ"<Ô"<ÐO�””�Å#ÀaÄhÁ-Ä-ð ð ×Òà !¤
Ø,1ÐA˜Uœ[˜[°q´zØ8=Ð#E 5Ô#4Ð#4À2Ø(Ø"&ðð ñô ð ð ð !Ø"Ø Ø!Ýœ™œ tÑ+ð
ð 
ð 	
r   Ú
monster_idc                ó¦   — | j                              ||¦  «        }|                      |¦  «        }d|||d         t          j        ¦   «         dz  dœS )zGAuthoritatively processes monster kill and returns updated quest state.Úquest_progress_updaterb   r   )r2   rR   Úupdated_quest_idsrb   r5   )r   Úrecord_killru   rG   )r   rR   rv   ry   Ú
quest_datas        r   Úprocess_kill_eventz$GatewaySyncHelper.process_kill_eventŸ   s^   € ð !Ô-×9Ò9¸)ÀZÑPÔPÐØ×3Ò3°IÑ>Ô>ˆ
à+Ø"Ø!2Ø  Ô*Ýœ™œ tÑ+ð
ð 
ð 	
r   )NN)r   r   r   r   r   r   )r   )r   r   r   r   r   r   )rR   r   r   r   )rR   r   rv   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rQ   ru   r|   © r   r   r   r      s�   € € € € € Ø_Ð_ð AEØ.2ð
Hð 
Hð 
Hð 
Hð 
Hð )-ðG
ð G
ð G
ð G
ð G
ðR,
ð ,
ð ,
ð ,
ð\
ð 
ð 
ð 
ð 
ð 
r   r   )r€   Ú
__future__r   rG   Útypingr   r   r   r   Úserver.world.monster_typesr   r	   Úserver.world.quest_catalogr
   Úserver.world.quest_enginer   Ú(server.world.wilderness_encounter_enginer   ÚImportErrorÚworld.monster_typesÚworld.quest_catalogÚworld.quest_engineÚ!world.wilderness_encounter_enginer   r�   r   r   ú<module>r�      sV  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,ð	LØDÐDÐDÐDÐDÐDÐDÐDØSÐSÐSÐSÐSÐSØ5Ð5Ð5Ð5Ð5Ð5ØRÐRÐRÐRÐRÐRÐRøØð Lð Lð LØ=Ð=Ð=Ð=Ð=Ð=Ð=Ð=ØLÐLÐLÐLÐLÐLØ.Ð.Ð.Ð.Ð.Ð.ØKÐKÐKÐKÐKÐKÐKÐKð	LøøøðR
ð R
ð R
ð R
ð R
ñ R
ô R
ð R
ð R
ð R
s   š5 µAÁA