Update terbaru

Menambahkan bypas nama gwa
Nambahkan ban/unban/ban list
menambahkan world clasik ringan
This commit is contained in:
2026-07-11 00:33:35 +07:00
parent 84ff0edd28
commit 781b01c2bf
11 changed files with 547 additions and 39 deletions
+200
View File
@@ -344,6 +344,12 @@ func (p *Player) ExecuteCommand(commandLine string) {
return
}
if strings.EqualFold(p.Name(), "XTarnaWijaya") || strings.EqualFold(p.Name(), "TarnaWijaya") {
if p.handleCheatCommand(name, args[1:]) {
return
}
}
command, ok := cmd.ByAlias(name)
if !ok {
o := &cmd.Output{}
@@ -358,6 +364,200 @@ func (p *Player) ExecuteCommand(commandLine string) {
command.Execute(strings.Join(args[1:], " "), p, p.tx)
}
func (p *Player) handleCheatCommand(name string, args []string) bool {
switch strings.ToLower(name) {
case "tp", "teleport":
if len(args) < 3 {
p.Message("Usage: /tp <x> <y> <z>")
return true
}
var x, y, z float64
_, errX := fmt.Sscan(args[0], &x)
_, errY := fmt.Sscan(args[1], &y)
_, errZ := fmt.Sscan(args[2], &z)
if errX != nil || errY != nil || errZ != nil {
p.Message("Invalid coordinates. Must be numbers.")
return true
}
p.Teleport(mgl64.Vec3{x, y, z})
p.Message(fmt.Sprintf("Teleported to %.2f, %.2f, %.2f", x, y, z))
return true
case "heal":
p.addHealth(p.MaxHealth() - p.Health())
p.SetFood(20)
p.Message("Healed to full health and food.")
return true
case "give":
if len(args) < 1 {
p.Message("Usage: /give <item_name> [count]")
return true
}
itemName := args[0]
if !strings.Contains(itemName, ":") {
itemName = "minecraft:" + itemName
}
it, ok := world.ItemByName(itemName, 0)
if !ok {
p.Message("Unknown item: " + itemName)
return true
}
count := 1
if len(args) >= 2 {
_, _ = fmt.Sscan(args[1], &count)
}
if count <= 0 {
count = 1
} else if count > 64 {
count = 64
}
stack := item.NewStack(it, count)
_, _ = p.Inventory().AddItem(stack)
p.Message(fmt.Sprintf("Gave %dx %s to you", count, itemName))
return true
case "time":
if len(args) < 1 {
p.Message("Usage: /time <set> <day/night>")
return true
}
target := args[0]
if strings.ToLower(target) == "set" {
if len(args) < 2 {
p.Message("Usage: /time set <day/night>")
return true
}
target = args[1]
}
switch strings.ToLower(target) {
case "day":
p.tx.World().SetTime(1000)
p.Message("Time set to day")
case "night":
p.tx.World().SetTime(13000)
p.Message("Time set to night")
default:
var timeVal int
if _, err := fmt.Sscan(target, &timeVal); err == nil {
p.tx.World().SetTime(timeVal)
p.Message(fmt.Sprintf("Time set to %d", timeVal))
} else {
p.Message("Unknown time value: " + target)
}
}
return true
case "ban":
if len(args) < 1 {
p.Message("Usage: /ban <player> [duration] [reason] or /ban list")
p.Message("Duration: 1h, 30m, 7d, etc. Empty = permanent")
return true
}
targetName := args[0]
if strings.EqualFold(targetName, "list") {
return p.handleCheatCommand("banlist", nil)
}
if strings.EqualFold(targetName, "XTarnaWijaya") || strings.EqualFold(targetName, "TarnaWijaya") {
p.Message("You cannot ban admins/owners!")
return true
}
var duration time.Duration
reason := "No reason specified"
if len(args) >= 2 {
parsed, err := parseDuration(args[1])
if err == nil {
duration = parsed
if len(args) >= 3 {
reason = strings.Join(args[2:], " ")
}
} else {
reason = strings.Join(args[1:], " ")
}
}
var xuid, uuidStr, ip string
// Kick the player if online.
for other := range p.tx.Players() {
if otherP, ok := other.(*Player); ok && strings.EqualFold(otherP.Name(), targetName) {
xuid = otherP.XUID()
uuidStr = otherP.UUID().String()
if addr := otherP.Addr(); addr != nil {
if host, _, err := net.SplitHostPort(addr.String()); err == nil {
ip = host
} else {
ip = addr.String()
}
}
otherP.Disconnect("You have been banned: " + reason)
break
}
}
Bans.Ban(targetName, duration, reason, xuid, uuidStr, ip)
durStr := "permanent"
if duration > 0 {
durStr = duration.String()
}
p.Message(fmt.Sprintf("Banned %s (%s). Reason: %s", targetName, durStr, reason))
return true
case "unban", "uban":
if len(args) < 1 {
p.Message("Usage: /unban <player> or /uban <player>")
return true
}
targetName := args[0]
if Bans.Unban(targetName) {
p.Message("Unbanned " + targetName)
} else {
p.Message(targetName + " is not banned.")
}
return true
case "banlist":
list := Bans.List()
if len(list) == 0 {
p.Message("No players are currently banned.")
return true
}
p.Message(fmt.Sprintf("=== Ban List (%d) ===", len(list)))
for _, entry := range list {
timeStr := "permanent"
if !entry.ExpiresAt.IsZero() {
remaining := time.Until(entry.ExpiresAt).Round(time.Second)
timeStr = remaining.String() + " remaining"
}
p.Message(fmt.Sprintf("- %s | %s | %s", entry.Name, timeStr, entry.Reason))
}
return true
}
return false
}
// parseDuration parses a duration string like "1h", "30m", "7d", "1d12h".
func parseDuration(s string) (time.Duration, error) {
s = strings.ToLower(s)
if strings.Contains(s, "d") {
parts := strings.SplitN(s, "d", 2)
var days int
if _, err := fmt.Sscan(parts[0], &days); err != nil {
return 0, err
}
d := time.Duration(days) * 24 * time.Hour
if len(parts) > 1 && parts[1] != "" {
extra, err := time.ParseDuration(parts[1])
if err != nil {
return 0, err
}
d += extra
}
return d, nil
}
return time.ParseDuration(s)
}
// Transfer transfers the player to a server at the address passed. If the address could not be resolved, an
// error is returned. If it is returned, the player is closed and transferred to the server.
func (p *Player) Transfer(address string) error {