§
    Ù¿j;#  ã                  óx   — d Z ddlmZ ddlZddlZddlmZmZmZm	Z	m
Z
 ddlmZmZmZmZmZ  G d„ d¦  «        ZdS )a   
Authoritative Safe Teleportation Channel & Destination Validation Service for FreeExile.

Implements the 3.5-second channeling state machine with instant movement
and damage interrupt triggers, alongside the 5-Gate Destination Validation
and spiral ray safe landing coordinate resolver.
é    )ÚannotationsN)ÚAnyÚCallableÚDictÚOptionalÚTuple)ÚInterruptReasonÚ
TargetTypeÚTeleportChannelResultÚTeleportChannelSessionÚTeleportChannelStatusc                  ó~   — e Zd ZdZ	 	 	 d4d5d	„Z	 	 	 	 	 d6d7d„Z	 d8d9d„Z	 	 	 d:d;d%„Zd<d(„Zd=d*„Z	d>d+„Z
d?d-„Z	 d@dAd3„ZdS )BÚTeleportServicezNAuthoritative service managing safe player-to-player and portal teleportation.NÚparty_serviceúOptional[Any]Úsocial_serviceÚguild_serviceÚreturnÚNonec                óZ   — || _         || _        || _        i | _        i | _        d| _        d S )Nr   )r   r   r   Úactive_channelsÚzone_statesÚ_channel_counter)Úselfr   r   r   s       ú6C:\Projects\FreeExile\server\world\teleport_service.pyÚ__init__zTeleportService.__init__   s:   € ð +ˆÔØ,ˆÔØ*ˆÔØBDˆÔØ68ˆÔØ%&ˆÔÐÐó    Fé   é   TÚzone_idÚstrÚis_boss_activeÚboolÚis_secret_activeÚplayer_countÚintÚmax_capacityÚ	is_activec                ó&   — |||||dœ| j         |<   dS )zMRegister or update runtime spatial capacity and quarantine states for a zone.)r"   r$   r%   r'   r(   N)r   )r   r    r"   r$   r%   r'   r(   s          r   Úset_zone_statezTeleportService.set_zone_state(   s-   € ð -Ø 0Ø(Ø(Ø"ð%
ð %
ˆÔ˜Ñ!Ð!Ð!r   Ú	player_idÚ	target_idÚtarget_typer
   Útarget_zone_idÚtarget_aliveúTuple[bool, str]c                óÂ  ‡— |sdS |t           j        k    rq| j        sdS t          | j        di ¦  «        }|                     |¦  «        }t          | j        di ¦  «        }|r|                     |¦  «        nd}	|	r	‰|	j        vrdS n•|t           j        k    r%| j        r| j                             |‰¦  «        sdS n`|t           j	        k    rP| j
        sdS t          | j
        d	i ¦  «        }
t          ˆfd
„|
                     ¦   «         D ¦   «         ¦  «        }|sdS | j                             |ddddœ¦  «        }|                     dd¦  «        |                     dd¦  «        k    rdS |                     dd¦  «        sdS |                     dd¦  «        rdS |                     dd¦  «        rdS |                     d¦  «        r|                     |¦  «        sdS dS )zUEvaluate the 5 authoritative security gates before initiating or completing teleport.)FuK   GATE_1_TARGET_DEAD: Má»¥c tiÃªu Ä‘Ã£ tá»­ vong hoáº·c khÃ´ng trá»±c tuyáº¿n)FuM   GATE_2_RELATIONSHIP_UNAUTHORIZED: Dá»‹ch vá»¥ tá»• Ä‘á»™i khÃ´ng kháº£ dá»¥ngÚplayer_party_mapÚpartiesN)Fu:   GATE_2_RELATIONSHIP_UNAUTHORIZED: KhÃ´ng cÃ¹ng tá»• Ä‘á»™i)FuI   GATE_2_RELATIONSHIP_UNAUTHORIZED: KhÃ´ng náº±m trong danh sÃ¡ch báº¡n bÃ¨)FuL   GATE_2_RELATIONSHIP_UNAUTHORIZED: Dá»‹ch vá»¥ bang há»™i khÃ´ng kháº£ dá»¥ngÚguildsc              3  ó8   •K  — | ]}|D ]}|j         ‰k    V — ŒŒd S ©N)r+   )Ú.0ÚrosterÚmr,   s      €r   ú	<genexpr>z?TeleportService.validate_destination_5_gates.<locals>.<genexpr>Z   s9   øè è € Ð_Ð_°VÐX^Ð_Ð_ÐST˜œ yÒ0Ð_Ð_Ð_Ð_Ð_Ð_Ð_r   )Fu9   GATE_2_RELATIONSHIP_UNAUTHORIZED: KhÃ´ng cÃ¹ng bang há»™ir   r   T)r%   r'   r(   r%   r'   )Fu>   GATE_3_CAPACITY_EXCEEDED: Khu vá»±c Ä‘Ã£ Ä‘áº§y ngÆ°á»�i chÆ¡ir(   )FuA   GATE_4_LIFECYCLE_CLOSED: Khu vá»±c Ä‘Ã£ Ä‘Ã³ng hoáº·c háº¿t háº¡nr"   F)Fu>   GATE_5_QUARANTINE_BOSS: Ä�ang trong giao tranh Boss nguy cáº¥pr$   )FuC   GATE_5_QUARANTINE_SECRET: Máº­t tháº¥t thá»­ thÃ¡ch Ä‘ang diá»…n raÚzone_player_hideout_)FuO   GATE_5_RESTRICTED_ISOLATION: SÃ o huyá»‡t riÃªng tÆ° cá»§a ngÆ°á»�i chÆ¡i khÃ¡c)TÚSUCCESS)r
   ÚPARTY_MEMBERr   ÚgetattrÚgetÚmembersÚFRIENDr   Ú	is_friendÚ	GUILDMATEr   ÚanyÚvaluesr   Ú
startswithÚendswith)r   r+   r,   r-   r.   r/   Ú	party_mapÚp_idr3   Úpartyr4   ÚfoundÚzs     `          r   Úvalidate_destination_5_gatesz,TeleportService.validate_destination_5_gates:   sP  ø€ ð ð 	hØgÐgð �*Ô1Ò1Ð1ØÔ%ð nØmÐmÝ Ô 2Ð4FÈÑKÔKˆIØ—=’= Ñ+Ô+ˆDÝ˜dÔ0°)¸RÑ@Ô@ˆGØ)-Ð7�G—K’K Ñ%Ô%Ð%°4ˆEØð [˜I¨U¬]Ð:Ð:ØZÐZð ;ð �JÔ-Ò-Ð-ØÔ&ð j¨dÔ.A×.KÒ.KÈIÐW`Ñ.aÔ.að jØiÐiðjð �JÔ0Ò0Ð0ØÔ%ð mØlÐlÝ˜TÔ/°¸2Ñ>Ô>ˆFÝÐ_Ð_Ð_Ð_¸v¿}º}¹¼Ð_Ñ_Ô_Ñ_Ô_ˆEØð ZØYÐYð Ô× Ò ØØ°ÀÐEÐEñ
ô 
ˆð �5Š5� Ñ#Ô# q§u¢u¨^¸QÑ'?Ô'?Ò?Ð?ØZÐZð �uŠu�[ $Ñ'Ô'ð 	^Ø]Ð]ð �5Š5Ð! 5Ñ)Ô)ð 	[ØZÐZà�5Š5Ð# UÑ+Ô+ð 	`Ø_Ð_ð ×$Ò$Ð%;Ñ<Ô<ð 	lÀ^×E\ÒE\Ð]fÑEgÔEgð 	lØkÐkàˆr   ç        Ú	initial_xÚfloatÚ	initial_yr   c                ó~  — |                       |||||¬¦  «        \  }}	|st          d|	¦  «        S | xj        dz  c_        d|› dt          t	          j        ¦   «         dz  ¦  «        › d| j        › �}
t          |
|||t	          j        ¦   «         d||t          j        |¬¦
  «
        }|| j        |<   t          d	|
¦  «        S )
zEValidate destination and start authoritative 3.5s channeling session.©r+   r,   r-   r.   r/   Fr   Úchan_Ú_iè  g      @)
Ú
session_idr+   r-   r,   Ú
start_timeÚduration_secondsrO   rQ   Ústatusr.   T)	rM   r   r   r&   Útimer   r   Ú
CHANNELINGr   )r   r+   r-   r,   r.   r/   rO   rQ   ÚokÚreasonÚ
channel_idÚsessions               r   Ústart_teleport_channelz&TeleportService.start_teleport_channelw   sì   € ð ×6Ò6ØØØ#Ø)Ø%ð 7ñ 
ô 
‰
ˆˆFð ð 	8Ý(¨°Ñ7Ô7Ð7àÐÔ Ñ"ÐÔØZ˜YÐZÐZ­­T¬Y©[¬[¸4Ñ-?Ñ)@Ô)@ÐZÐZÀ4ÔCXÐZÐZˆ
Ý(Ø!ØØ#ØÝ”y‘{”{Ø ØØÝ(Ô3Ø)ð
ñ 
ô 
ˆð +2ˆÔ˜YÑ'Ý$ T¨:Ñ6Ô6Ð6r   ÚmagúOptional[InterruptReason]c                óL   — || j         v r|dk    r| j         |= t          j        S dS )zWTrigger immediate channel cancellation if movement magnitude exceeds threshold (>0.05).gš™™™™™©?N)r   r	   ÚINTERRUPT_MOVEMENT)r   r+   ra   s      r   Úon_player_movedzTeleportService.on_player_moved�   s1   € à˜Ô,Ð,Ð,°°t²°ØÔ$ YÐ/Ý"Ô5Ð5Øˆtr   Údamagec                óL   — || j         v r|dk    r| j         |= t          j        S dS )zQTrigger immediate channel cancellation if player receives incoming damage (>0.0).rN   N)r   r	   ÚINTERRUPT_DAMAGE)r   r+   rf   s      r   Úon_player_damagedz!TeleportService.on_player_damaged¤   s1   € à˜Ô,Ð,Ð,°¸#²°ØÔ$ YÐ/Ý"Ô3Ð3Øˆtr   c                ó,   — || j         v r
| j         |= dS dS )zLManually cancel an active channeling session (e.g. dodging or manual abort).TF)r   )r   r+   s     r   Úcancel_channelzTeleportService.cancel_channel«   s%   € à˜Ô,Ð,Ð,ØÔ$ YÐ/Ø�4Øˆur   Úelapsed_timec                óò   — | j                              |¦  «        }|sdS ||j        k     rdS |                      ||j        |j        |j        d¬¦  «        \  }}|s| j         |= d|fS |j        }| j         |= d|fS )zOAuthoritatively complete channeling session and return verified target zone ID.)FÚNO_ACTIVE_CHANNEL)FÚCAST_INCOMPLETETrS   F)r   r?   rX   rM   r,   r-   r.   )r   r+   rl   Úchanr\   r]   Ú	dest_zones          r   Úcomplete_channelz TeleportService.complete_channel²   s­   € àÔ#×'Ò'¨	Ñ2Ô2ˆØð 	.Ø-Ð-à˜$Ô/Ò/Ð/Ø+Ð+ð ×6Ò6ØØ”nØÔ(ØÔ.Øð 7ñ 
ô 
‰
ˆˆFð ð 	!ØÔ$ YÐ/Ø˜&�=Ð àÔ'ˆ	ØÔ  Ð+Ø�YˆÐr   Útarget_xÚtarget_yÚblocked_checkerú(Optional[Callable[[float, float], bool]]úTuple[float, float]c           	     ó  — dt           j        dz  t           j        dz  dt           j        z  dz  t           j        dt           j        z  dz  dt           j        z  dz  dt           j        z  dz  g}dD ]m}|D ]h}t          ||t          j        |¦  «        z  z   d¦  «        }t          ||t          j        |¦  «        z  z   d¦  «        }|� |||¦  «        s||fc c S ŒiŒnt          |d	z   d¦  «        t          |d¦  «        fS )
z[Resolve safe landing coordinates using spiral ray search (2.0m - 3.0m) avoiding collisions.rN   é   é   é   é   é   )ç       @g      @g      @Nr~   )ÚmathÚpiÚroundÚcosÚsin)	r   rs   rt   ru   ÚanglesÚradiusÚangleÚcand_xÚcand_ys	            r   Úresolve_safe_landing_coordsz+TeleportService.resolve_safe_landing_coordsË   s  € ð ÝŒG�a‰KÝŒG�a‰KØ•”‰K˜!‰OÝŒGØ•”‰K˜!‰OØ•”‰K˜!‰OØ•”‰K˜!‰Oð	
ˆð &ð 	*ð 	*ˆFØð *ð *�Ý˜x¨&µ4´8¸E±?´?Ñ*BÑBÀAÑFÔF�Ý˜x¨&µ4´8¸E±?´?Ñ*BÑBÀAÑFÔF�Ø"Ð*°/°/À&È&Ñ2QÔ2QÐ*Ø! 6˜>Ð)Ð)Ð)Ð)Ð)ð +ð*õ
 �X ‘^ QÑ'Ô'­¨x¸Ñ);Ô);Ð;Ð;r   )NNN)r   r   r   r   r   r   r   r   )FFr   r   T)r    r!   r"   r#   r$   r#   r%   r&   r'   r&   r(   r#   r   r   )T)r+   r!   r,   r!   r-   r
   r.   r!   r/   r#   r   r0   )TrN   rN   )r+   r!   r-   r
   r,   r!   r.   r!   r/   r#   rO   rP   rQ   rP   r   r   )r+   r!   ra   rP   r   rb   )r+   r!   rf   rP   r   rb   )r+   r!   r   r#   )r+   r!   rl   rP   r   r0   r6   )rs   rP   rt   rP   ru   rv   r   rw   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r*   rM   r`   re   ri   rk   rr   r‰   © r   r   r   r      s  € € € € € ØXÐXð (,Ø(,Ø'+ð	'ð 'ð 'ð 'ð 'ð   %Ø!&ØØØð
ð 
ð 
ð 
ð 
ð0 "ð;ð ;ð ;ð ;ð ;ðF "ØØð$7ð $7ð $7ð $7ð $7ðLð ð ð ðð ð ð ðð ð ð ðð ð ð ð: EIð	<ð <ð <ð <ð <ð <ð <r   r   )r�   Ú
__future__r   r   rZ   Útypingr   r   r   r   r   Úserver.world.town_portal_typesr	   r
   r   r   r   r   rŽ   r   r   ú<module>r’      sá   ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7ðð ð ð ð ð ð ð ð ð ð ð ð ð ðJ<ð J<ð J<ð J<ð J<ñ J<ô J<ð J<ð J<ð J<r   