extends NpcScript class_name WaterPondGlobal # const QUEST_ID : int = ProgressCommons.Quest.SNAKE_PIT_BITING_THIRST const MAX_BITES : int = 5 const FILL_TIME : float = 5.0 const FILL_TICKS : int = 10 const FILL_TICK_TIME : float = FILL_TIME / FILL_TICKS const MOVE_TOLERANCE_SQUARED : float = 8.0 * 8.0 # Per-player bite counters [PlayerRID, BiteCount] static var biteCounters : Dictionary[int, int] = {} # Signal handling static func StartJugTransport(player : PlayerAgent): var rid : int = player.get_rid().get_id() biteCounters[rid] = MAX_BITES if not player.agent_damaged.is_connected(OnBite): player.agent_damaged.connect(OnBite) static func StopJugTransport(player : PlayerAgent): var rid : int = player.get_rid().get_id() biteCounters.erase(rid) if player.agent_damaged.is_connected(OnBite): player.agent_damaged.disconnect(OnBite) # Biting handling static func OnBite(player : PlayerAgent, value : int): if value == 0 or player.progress.GetQuest(QUEST_ID) != ProgressCommons.SNAKE_PIT_BITING_THIRST.STARTED: return var rid : int = player.get_rid().get_id() if not biteCounters.has(rid): return var remaining : int = biteCounters[rid] - 1 biteCounters[rid] = remaining NpcCommons.PushTracker(player, "水罐完整度", remaining, MAX_BITES, "%") if remaining <= 0: Spill(player) static func Spill(player : PlayerAgent): StopJugTransport(player) NpcCommons.SetQuest(player, QUEST_ID, ProgressCommons.SNAKE_PIT_BITING_THIRST.STARTED) NpcCommons.ClearTracker(player) NpcCommons.PushNotification(player, "你被蛇咬得太多,水罐漏空了。回清水池重新装水。") # Jug filling handling func OnFillTick(player : PlayerAgent, startPos : Vector2, tick : int): if player.position.distance_squared_to(startPos) > MOVE_TOLERANCE_SQUARED: NpcCommons.ClearTracker(player) NpcCommons.PushNotification(player, "你动得太早,水还没装满。") else: if tick >= FILL_TICKS: CompleteFill(player) else: NpcCommons.PushTracker(player, "正在装水", tick, FILL_TICKS, "%") ScheduleTick(player, startPos, tick) func ScheduleTick(player : PlayerAgent, startPos : Vector2, tick : int): AddTimer(own, FILL_TICK_TIME, OnFillTick.bind(player, startPos, tick + 1), player.nick) func CompleteFill(player : PlayerAgent): StartJugTransport(player) NpcCommons.PushTracker(player, "水罐完整度", MAX_BITES, MAX_BITES, "%") NpcCommons.PushNotification(player, "水罐装满了,尽快带回毛罗。")