e7299b17e9
Stack installed: - netfox v1.35.3 (core + extras + noray + internals) - godot-jolt v0.16.0-stable Architecture: - Server: ENet transport (works headless, no netfox deps) - Client/Editor: netfox rollback (RollbackSynchronizer, TickInterpolator) New/modified: - docs/migration-netfox-plan.md — migration architecture - scripts/network/network_manager.gd — netfox-aware ENet fallback - scripts/network/player.gd — clean base player - client/characters/player_netfox.gd — rollback player w/ WeaponManager - client/characters/input/player_net_input.gd — BaseNetInput subclass - client/characters/character/fps_character_controller.gd — netfox input feed - client/weapons/ — weapon data, registry, TacticalWeaponHitscan, WeaponManager - client/scripts/round_replicator.gd — client-side round state bridge - server/scripts/round_manager.gd — improved state machine - server/scripts/plugin_api/plugin_manager.gd — refined plugin system - config: enemy_tag, ally_tag for meatball targeting Removed: old C++ SimulationServer GDExtension (replaced by netfox rollback)
24 lines
657 B
Python
24 lines
657 B
Python
from more_itertools import consume # noqa: F401
|
|
|
|
|
|
# copied from jaraco.itertools 6.1
|
|
def ensure_unique(iterable, key=lambda x: x):
|
|
"""
|
|
Wrap an iterable to raise a ValueError if non-unique values are encountered.
|
|
|
|
>>> list(ensure_unique('abc'))
|
|
['a', 'b', 'c']
|
|
>>> consume(ensure_unique('abca'))
|
|
Traceback (most recent call last):
|
|
...
|
|
ValueError: Duplicate element 'a' encountered.
|
|
"""
|
|
seen = set()
|
|
seen_add = seen.add
|
|
for element in iterable:
|
|
k = key(element)
|
|
if k in seen:
|
|
raise ValueError(f"Duplicate element {element!r} encountered.")
|
|
seen_add(k)
|
|
yield element
|