# Examples

In this section you can find some example scripts written with LuaLink. Want to see your script here? Submit a PR and we'll consider adding it to the list.


# Ragemode

Basic One In The Chamber (OIC) like gamemode, inspired by Freggy's version for LuaLink v1.

Notes
1. This script assumes that you are using the map hijacked. This map can be found in Freggy's original repository.

ragemode.lua
ragemode.lua 5.25KB

local ItemStack = java.import "org.bukkit.inventory.ItemStack"
local Material = java.import "org.bukkit.Material"
local Location = java.import "org.bukkit.Location"
local GameRule = java.import "org.bukkit.GameRule"
local Difficulty = java.import "org.bukkit.Difficulty"
local Bukkit = java.import "org.bukkit.Bukkit"
local Player = java.import "org.bukkit.entity.Player"
local EntityDamageEvent = java.import "org.bukkit.event.entity.EntityDamageEvent"
local MiniMessage = java.import "net.kyori.adventure.text.minimessage.MiniMessage":miniMessage()
local TagResolver = java.import "net.kyori.adventure.text.minimessage.tag.resolver.TagResolver"
local Placeholder = java.import "net.kyori.adventure.text.minimessage.tag.resolver.Placeholder"
local Sound = java.import "org.bukkit.Sound"
local PotionEffect = java.import "org.bukkit.potion.PotionEffect"
local PotionEffectType = java.import "org.bukkit.potion.PotionEffectType"

local lastDamager = {}

local MESSAGES = {
    ["player_join"] = "<green>Welcome to </green><yellow>RageMode</yellow>",
    ["player_kill"] = "<green><killer> <red>killed <victim>",
}

local world = Bukkit:getWorld("world")
local spawns = {
  Location(world, -496, 31, 149),
  Location(world, -496, 31, 165),
  Location(world, -487, 31, 151),
  Location(world, -487, 31, 162),
  Location(world, -461, 33, 166),
  Location(world, -464, 33, 147),
  Location(world, -434, 35, 140),
  Location(world, -394, 36, 153),
  Location(world, -394, 35, 160),
  Location(world, -404, 35, 152),
  Location(world, -404, 35, 159),
  Location(world, -414, 35, 155),
  Location(world, -442, 35, 156),
  Location(world, -442, 37, 171),
  Location(world, -469, 32, 160),
}

local function getRandomSpawn()
  return spawns[math.random(#spawns)]
end

local function printf(str, ...)
  return print(str:format(...))
end

local function applySwiftness(player)
    local swiftness = PotionEffect(PotionEffectType.SPEED, 999999, 1, false, false, true)
    player:addPotionEffect(swiftness)
end

local function giveKit(player)
  local inventory = player:getInventory()
  inventory:clear()

  local bow = ItemStack:of(Material.BOW)
  local meta = bow:getItemMeta()
  meta:setUnbreakable(true)
  bow:setItemMeta(meta)

  inventory:setItemInMainHand(bow)
  inventory:setItem(1, ItemStack:of(Material.ARROW, 1))

  applySwiftness(player)
end

local function giveArrow(player)
  local inventory = player:getInventory()
  inventory:setItem(1, ItemStack:of(Material.ARROW, 1))
end

local function broadcastKill(killer, victim)
  local tags = TagResolver:builder()
    :resolver(Placeholder:unparsed("killer", killer:getName()))
    :resolver(Placeholder:unparsed("victim", victim:getName()))
    :build()
  local message = MESSAGES["player_kill"]

  Bukkit:getServer():broadcast(MiniMessage:deserialize(message, tags))
  world:playSound(victim:getLocation(), Sound.ENTITY_FIREWORK_ROCKET_BLAST, 1.0, 1.0)
end

script:onLoad(function(event)
  world:setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false)
  world:setGameRule(GameRule.DO_MOB_SPAWNING, false)
  world:setGameRule(GameRule.DO_IMMEDIATE_RESPAWN, true)
  world:setGameRule(GameRule.DO_WEATHER_CYCLE, false)
  world:setDifficulty(Difficulty.EASY)
  world:setTime(1000)

  for _, player in ipairs(Bukkit:getOnlinePlayers()) do
    applySwiftness(player)
  end
end)

script:registerListener("org.bukkit.event.entity.EntityDamageByEntityEvent", function(event)
  local damaged = event:getEntity()
  local damager = event:getDamager()

  if Player.class:isInstance(damaged) and Player.class:isInstance(damager) then
    lastDamager[damaged:getUniqueId():toString()] = damager
    printf("Damage: %s damaged by %s", damaged:getName(), damager:getName())
  end
end)

script:registerListener("org.bukkit.event.entity.PlayerDeathEvent", function(event)
  event:setDeathMessage("")
  event:setKeepInventory(true)
  event:getDrops():clear()

  local victim = event:getEntity()
  local victimId = victim:getUniqueId():toString()
  local killer = lastDamager[victimId]

  if killer then
    printf("Kill: %s killed %s", killer:getName(), victim:getName())
    giveArrow(killer)
    broadcastKill(killer, victim)
    lastDamager[victimId] = nil
  end
end)

script:registerListener("org.bukkit.event.entity.ProjectileHitEvent", function(event)
  local projectile = event:getEntity()
  local hitEntity = event:getHitEntity()
  local shooter = projectile:getShooter()

  if projectile:getType():name() == "ARROW" and
     hitEntity and Player.class:isInstance(hitEntity) and
     shooter and Player.class:isInstance(shooter) then
    lastDamager[hitEntity:getUniqueId():toString()] = shooter
    hitEntity:damage(100.0, shooter)
  end

  projectile:remove()
end)

script:registerListener("org.bukkit.event.entity.EntityShootBowEvent", function(event)
  event:setConsumeItem(false)
end)

script:registerListener("org.bukkit.event.player.PlayerDropItemEvent", function(event)
  event:setCancelled(true)
end)

script:registerListener("org.bukkit.event.player.PlayerRespawnEvent", function(event)
  local player = event:getPlayer()
  event:setRespawnLocation(getRandomSpawn())
  giveKit(player)
end)

script:registerListener("org.bukkit.event.player.PlayerJoinEvent", function(event)
  local player = event:getPlayer()
  giveKit(player)
  player:teleport(getRandomSpawn())
  player:sendMessage(MiniMessage:deserialize(MESSAGES["player_join"]))
end)

# Gamemode Commands

A basic script that provides shorthand commands for changing gamemodes.

Command Description Permission
/gma [player] Set game mode to Adventure minecraft.command.gamemode.adventure[.other]
/gmsp [player] Set game mode to Spectator minecraft.command.gamemode.spectator[.other]
/gms [player] Set game mode to Survival minecraft.command.gamemode.survival[.other]
/gmc [player] Set game mode to Creative minecraft.command.gamemode.creative[.other]
Notes
1. The [player] argument is optional. If omitted, the command affects the sender.
2. To change another player's gamemode, the sender must have the base permission plus .other.
3. You can use @a as the player argument to affect all players. This also requires the .other permission extension.

gamemode_commands.lua
gamemode_commands.lua 4.04KB

local GameMode = java.import "org.bukkit.GameMode"

local function setGameMode(player, mode)

    if player == "@a" then
        for _, onlinePlayer in ipairs(totable(server:getOnlinePlayers())) do
            onlinePlayer:setGameMode(mode)
        end
    else
        if type(player) == "string" then
            player = server:getPlayer(player)
        end
        if player == nil then
            return "<red>Player not found"
        end
        player:setGameMode(mode)
    end

    return nil  -- Success, no error message
end

local function sendMessage(sender, target, mode)
    if target == "@a" then
        sender:sendRichMessage("<green>Game mode set to <yellow>" .. mode .. " <green>for all players")
        return
    end

    if sender:getName() == target then
        sender:sendRichMessage("<green>Game mode set to <yellow>" .. mode)
    else
        sender:sendRichMessage("<green>Game mode set to <yellow>" .. mode .. " <green>for <yellow>" .. target)
    end
end


-- GMC
script:registerCommand(function(sender, args)
    local playerName;
    if #args > 0 then
        playerName = args[1]
    end
    if playerName ~= nil and playerName ~= sender:getName() and not sender:hasPermission("minecraft.command.gamemode.creative.other") then
        sender:sendRichMessage("<red>You do not have permission to change the gamemode of other players")
        return
    end
    local result = setGameMode(playerName or sender, GameMode.CREATIVE)
    if result then
        sender:sendRichMessage(result)
    else
        sendMessage(sender, playerName or sender:getName(), "Creative")
    end
end, {
    name = "gmc",
    description = "Set game mode to Creative",
    usage = "/gmc [player]",
    permission = "minecraft.command.gamemode.creative"
})

-- GMS
script:registerCommand(function(sender, args)
    local playerName;
    if #args > 0 then
        playerName = args[1]
    end
    if playerName ~= nil and playerName ~= sender:getName() and not sender:hasPermission("minecraft.command.gamemode.survival.other") then
        sender:sendRichMessage("<red>You do not have permission to change the gamemode of other players")
        return
    end
    local result = setGameMode(playerName or sender, GameMode.SURVIVAL)
    if result then
        sender:sendRichMessage(result)
    else
        sendMessage(sender, playerName or sender:getName(), "Survival")
    end
end, {
    name = "gms",
    description = "Set game mode to Survival",
    usage = "/gms [player]",
    permission = "minecraft.command.gamemode.survival"
})

-- GMSP

script:registerCommand(function(sender, args)
    local playerName;
    if #args > 0 then
        playerName = args[1]
    end

    if playerName ~= nil and playerName ~= sender:getName() and not sender:hasPermission("minecraft.command.gamemode.spectator.other") then
        sender:sendRichMessage("<red>You do not have permission to change the gamemode of other players")
        return
    end
    local result = setGameMode(playerName or sender, GameMode.SPECTATOR)
    if result then
        sender:sendRichMessage(result)
    else
        sendMessage(sender, playerName or sender:getName(), "Spectator")
    end
end, {
    name = "gmsp",
    description = "Set game mode to Spectator",
    usage = "/gmsp [player]",
    permission = "minecraft.command.gamemode.spectator"
})

-- GMA

script:registerCommand(function(sender, args)
    local playerName;
    if #args > 0 then
        playerName = args[1]
    end

    if playerName ~= nil and playerName ~= sender:getName() and not sender:hasPermission("minecraft.command.gamemode.adventure.other") then
        sender:sendRichMessage("<red>You do not have permission to change the gamemode of other players")
        return
    end
    local result = setGameMode(playerName or sender, GameMode.ADVENTURE)
    if result then
        sender:sendRichMessage(result)
    else
        sendMessage(sender, playerName or sender:getName(), "Adventure")
    end
end, {
    name = "gma",
    description = "Set game mode to Adventure",
    usage = "/gma [player]",
    permission = "minecraft.command.gamemode.adventure"
})