M2.6: server rules (PvP, raiding, locks and friends, death penalty, difficulty, wolf grace), chat, admin commands, server console

This commit is contained in:
Paul Bailey
2026-11-04 22:54:40 +00:00
parent 47fc116839
commit 2ab79b68c6
26 changed files with 1195 additions and 57 deletions

View File

@@ -287,6 +287,38 @@ func melee(player: Node3D, target: Node3D) -> bool:
notify.emit("Killed a %s" % target.display_name().to_lower())
return true
## A melee blow at another player (online, with PvP on). Online only.
func hit_player(player: Node3D, peer: int) -> bool:
if _online():
if not melee_stats(player).armed:
notify.emit(NEED_WEAPON)
return false
return _ask("hit_player", [peer])
if not Net.is_server() or not PlayerNet.proxies.has(peer) or player.get("peer") == peer:
return false
var target: Node3D = PlayerNet.proxies[peer]
if not preload("res://scripts/net/rules.gd").pvp():
notify.emit("PvP is off on this server")
return false
if target.survival.dead:
return false
var m := melee_stats(player)
if not m.armed:
notify.emit(NEED_WEAPON)
return false
# (Positions are where the server last heard you both were: a little slack.)
if player.global_position.distance_to(target.global_position) > m.reach + 2.5:
return false
if Time.get_ticks_msec() < int(player.melee_ready_at):
return false
if not player.survival.use_stamina(m.stamina):
notify.emit("Too tired")
return false
player.melee_ready_at = Time.get_ticks_msec() + int(m.cooldown * 1000.0 * 0.8)
target.survival.damage(m.damage, player.global_position, String(player.display))
notify.emit("Hit %s" % String(target.display))
return true
## An arrow or thrown spear reaching an animal (projectile.gd).
func projectile_hit(shooter: Node3D, target: Node3D, damage: float, at: Vector3, embed_id: String) -> void:
if not is_instance_valid(target) or not target.is_in_group("creature"):