• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!
  • New resources must be posted under Resources tab. A discussion thread will be created automatically, you can't open threads manually anymore.

The Gambling Man, the interactive dicer v2ByTejdi

T

tejdi

Guest
Oryginal thread with informations: http://otland.net/threads/the-gambling-man-the-interactive-dicer.197833/

Zd8aNTo.png


I added "numbers game" with 1/2/3/4/5/6 and 400% win. [configureable]
dice_gamble.lua

Code:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
function onCreatureAppear(cid)                npcHandler:onCreatureAppear(cid) end
function onCreatureDisappear(cid)            npcHandler:onCreatureDisappear(cid) end
function onCreatureSay(cid, type, msg)        npcHandler:onCreatureSay(cid, type, msg) end
function onThink()                            npcHandler:onThink() end
local function delayMoneyRemoval(item, pos)
    doRemoveItem(getTileItemById(pos, item).uid)
    return true
end
local function placeMoney(amount, table_middle_pos)
    local remain = amount
    local crystal_coins = 0
    local platinum_coins = 0
    if (math.floor(amount / 10000) >= 1) then
        crystal_coins = math.floor(amount / 10000)
        remain = remain - crystal_coins * 10000
    end
    if ((remain / 100) >= 1) then
        platinum_coins = remain / 100
    end
    addEvent(doCreateItem, 550, 2152, platinum_coins, table_middle_pos)
    addEvent(doCreateItem, 600, 2160, crystal_coins, table_middle_pos)
end

local function rollDice(roll, cc_count, pc_count, table_left_pos, table_middle_pos, npc)
    local dice_ids = {5792, 5793, 5794, 5795, 5796, 5797}
    local random_rollval = math.random(1,6)
    local total_g = (10000 * cc_count) + (100 * pc_count)
    local prize_percent = 0.8 -- 80%
    local prize_percentl = 4.0 -- 400%
    if ((total_g) <= 300000 and (total_g) >= 5000) then
        doSendMagicEffect(table_left_pos, CONST_ME_CRAPS)
        for _, itemId in pairs(dice_ids) do
                if(getTileItemById(table_left_pos, itemId).uid > 0) then
                doTransformItem(getTileItemById(table_left_pos, itemId).uid, dice_ids[random_rollval])
            end
        end
        if (roll == 1 and random_rollval <= 3) then
            placeMoney(total_g + (total_g * prize_percent), table_middle_pos)
            addEvent(doSendMagicEffect, 400, table_left_pos, CONST_ME_SOUND_GREEN)
            addEvent(doSendMagicEffect, 700, table_left_pos, CONST_ME_SOUND_GREEN)
            addEvent(doCreatureSay, 500, npc, "You win!", TALKTYPE_SAY, false, 0)
        elseif (roll == 2 and random_rollval >= 4) then
            placeMoney(total_g + (total_g * prize_percent), table_middle_pos)
            addEvent(doSendMagicEffect, 400, table_left_pos, CONST_ME_SOUND_GREEN)
            addEvent(doSendMagicEffect, 700, table_left_pos, CONST_ME_SOUND_GREEN)
            addEvent(doCreatureSay, 500, npc, "You win!", TALKTYPE_SAY, false, 0)
            elseif (roll == 3 and random_rollval == 1) then
            placeMoney(total_g + (total_g * prize_percentl), table_middle_pos)
            addEvent(doSendMagicEffect, 400, table_left_pos, CONST_ME_SOUND_GREEN)
            addEvent(doSendMagicEffect, 700, table_left_pos, CONST_ME_SOUND_GREEN)
            addEvent(doCreatureSay, 500, npc, "You win!", TALKTYPE_SAY, false, 0)
                        elseif (roll == 4 and random_rollval == 2) then
            placeMoney(total_g + (total_g * prize_percentl), table_middle_pos)
            addEvent(doSendMagicEffect, 400, table_left_pos, CONST_ME_SOUND_GREEN)
            addEvent(doSendMagicEffect, 700, table_left_pos, CONST_ME_SOUND_GREEN)
            addEvent(doCreatureSay, 500, npc, "You win!", TALKTYPE_SAY, false, 0)
                        elseif (roll == 5 and random_rollval == 3) then
            placeMoney(total_g + (total_g * prize_percentl), table_middle_pos)
            addEvent(doSendMagicEffect, 400, table_left_pos, CONST_ME_SOUND_GREEN)
            addEvent(doSendMagicEffect, 700, table_left_pos, CONST_ME_SOUND_GREEN)
            addEvent(doCreatureSay, 500, npc, "You win!", TALKTYPE_SAY, false, 0)
                        elseif (roll == 6 and random_rollval == 4) then
            placeMoney(total_g + (total_g * prize_percentl), table_middle_pos)
            addEvent(doSendMagicEffect, 400, table_left_pos, CONST_ME_SOUND_GREEN)
            addEvent(doSendMagicEffect, 700, table_left_pos, CONST_ME_SOUND_GREEN)
            addEvent(doCreatureSay, 500, npc, "You win!", TALKTYPE_SAY, false, 0)
                        elseif (roll == 7 and random_rollval == 5) then
            placeMoney(total_g + (total_g * prize_percentl), table_middle_pos)
            addEvent(doSendMagicEffect, 400, table_left_pos, CONST_ME_SOUND_GREEN)
            addEvent(doSendMagicEffect, 700, table_left_pos, CONST_ME_SOUND_GREEN)
            addEvent(doCreatureSay, 500, npc, "You win!", TALKTYPE_SAY, false, 0)
                        elseif (roll == 8 and random_rollval == 6) then
            placeMoney(total_g + (total_g * prize_percentl), table_middle_pos)
            addEvent(doSendMagicEffect, 400, table_left_pos, CONST_ME_SOUND_GREEN)
            addEvent(doSendMagicEffect, 700, table_left_pos, CONST_ME_SOUND_GREEN)
            addEvent(doCreatureSay, 500, npc, "You win!", TALKTYPE_SAY, false, 0)
        else
            addEvent(doSendMagicEffect, 400, table_left_pos, CONST_ME_BLOCKHIT)
            addEvent(doSendMagicEffect, 700, table_left_pos, CONST_ME_BLOCKHIT)
            addEvent(doCreatureSay, 500, npc, "Better luck next time.", TALKTYPE_SAY, false, 0)
           
        end
   
        doCreatureSay(npc, string.format("%s rolled a %d.", getCreatureName(npc), random_rollval), TALKTYPE_ORANGE_1, false, 0, table_left_pos)
    else
        addEvent(doCreateItem, 100, 2160, cc_count, table_middle_pos)
        addEvent(doCreateItem, 150, 2152, pc_count, table_middle_pos)
        doCreatureSay(npc, "The minimum wager is 5K and the maximum wager is 300K.", TALKTYPE_SAY, false, 0)
    end
    return true
end
function creatureSayCallback(cid, type, msg)
    -- NPC userdata instance
    local npc = getNpcCid()
    -- Participating player userdata instance
    local position = {x = getNpcPos().x+2, y = getNpcPos().y, z = getNpcPos().z}
    position.stackpos = STACKPOS_TOP_CREATURE
    local player_uid = getThingfromPos(position).uid
    -- Game table position userdata instances
    local table_left_pos = {x = 1088, y = 512, z = 7}
    local table_middle_pos = {x = 1089, y = 512, z = 7}
    -- Search for coins on the left and middle tables and create item userdata instances
    local table_middle_cc = getTileItemById(table_middle_pos, 2160)
    local table_middle_pc = getTileItemById(table_middle_pos, 2152)
    -- Other variables
    local cc_count = 0
    local pc_count = 0
    local ROLL, LOW, HIGH, ROL1, ROL2, ROL3, ROL4, ROL5, ROL6 = 0, 1, 2, 3, 4, 5, 6, 7, 8

    if (player_uid ~= 0) then
        if ((msgcontains(string.lower(msg), 'high') or msgcontains(string.lower(msg), 'h')) or msgcontains(string.lower(msg), '456') and (isPlayer(player_uid) and player_uid == cid)) then
            ROLL = HIGH
        elseif ((msgcontains(string.lower(msg), 'low') or msgcontains(string.lower(msg), 'l')) or msgcontains(string.lower(msg), '123') and (isPlayer(player_uid) and player_uid == cid)) then
            ROLL = LOW
        elseif ((msgcontains(string.lower(msg), '1')and (isPlayer(player_uid) and player_uid == cid))) then
            ROLL = ROL1
        elseif ((msgcontains(string.lower(msg), '2')and (isPlayer(player_uid) and player_uid == cid))) then
            ROLL = ROL2
        elseif ((msgcontains(string.lower(msg), '3')and (isPlayer(player_uid) and player_uid == cid))) then
            ROLL = ROL3
        elseif ((msgcontains(string.lower(msg), '4')and (isPlayer(player_uid) and player_uid == cid))) then
            ROLL = ROL4
        elseif ((msgcontains(string.lower(msg), '5')and (isPlayer(player_uid) and player_uid == cid))) then
            ROLL = ROL5
                    elseif ((msgcontains(string.lower(msg), '6')and (isPlayer(player_uid) and player_uid == cid))) then
            ROLL = ROL6
        else
            return false
        end

        if (table_middle_cc.uid ~= 0) then
            cc_count = table_middle_cc.type
            doTeleportThing(table_middle_cc.uid, table_left_pos)
            addEvent(delayMoneyRemoval, 300, 2160, table_left_pos)
        end
        if (table_middle_pc.uid ~= 0) then
            pc_count = table_middle_pc.type
            doTeleportThing(table_middle_pc.uid, table_left_pos)
            addEvent(delayMoneyRemoval, 300, 2152, table_left_pos)
        end
        addEvent(rollDice, 500, ROLL, cc_count, pc_count, table_left_pos, table_middle_pos, npc)
    else
        return false
    end
    return true
end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
 
I'll try it for TFS 1.0.
Keep up the imprevements, good work.

Kind Regards,
Eldin.
 
local table_left_pos = {x = 1088, y = 512, z = 7}
local table_middle_pos = {x = 1089, y = 512, z = 7}

replace to:

local table_left_pos = {x = position.x - 2, y = position.y, z = position.z}
local table_middle_pos = {x = position.x - 1, y = position.y, z = position.z}

to make it working with depot setting like this, without configuring position anymore
 
npc count all money now, fixed cid identification:
Code:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
function onCreatureAppear(cid)  npcHandler:onCreatureAppear(cid) end
function onCreatureDisappear(cid)  npcHandler:onCreatureDisappear(cid) end
function onCreatureSay(cid, type, msg)  npcHandler:onCreatureSay(cid, type, msg) end
function onThink()  npcHandler:onThink() end

local function placeMoney(amount, table_middle_pos)
  local remain = amount
  local crystal_coins = 0
  local platinum_coins = 0
  if (math.floor(amount / 10000) >= 1) then
  crystal_coins = math.floor(amount / 10000)
  remain = remain - crystal_coins * 10000
  end
  if ((remain / 100) >= 1) then
  platinum_coins = remain / 100
  end
  addEvent(doCreateItem, 550, 2152, platinum_coins, table_middle_pos)
  addEvent(doCreateItem, 600, 2160, crystal_coins, table_middle_pos)
end

local function rollDice(roll, cc_count, pc_count, table_left_pos, table_middle_pos, npc)
  local dice_ids = {5792, 5793, 5794, 5795, 5796, 5797}
  local random_rollval = math.random(1,6)
  local total_g = (10000 * cc_count) + (100 * pc_count)
  local prize_percent = 0.8 -- 80%
  local prize_percentl = 4.0 -- 400%
  if ((total_g) <= 300000 and (total_g) >= 5000) then
  doSendMagicEffect(table_left_pos, CONST_ME_CRAPS)
  for _, itemId in pairs(dice_ids) do
  if(getTileItemById(table_left_pos, itemId).uid > 0) then
  doTransformItem(getTileItemById(table_left_pos, itemId).uid, dice_ids[random_rollval])
  end
  end
  if (roll == 1 and random_rollval <= 3) then
  placeMoney(total_g + (total_g * prize_percent), table_middle_pos)
  addEvent(doSendMagicEffect, 400, table_left_pos, CONST_ME_SOUND_GREEN)
  addEvent(doSendMagicEffect, 700, table_left_pos, CONST_ME_SOUND_GREEN)
  addEvent(doCreatureSay, 500, npc, "You win!", TALKTYPE_SAY, false, 0)
  elseif (roll == 2 and random_rollval >= 4) then
  placeMoney(total_g + (total_g * prize_percent), table_middle_pos)
  addEvent(doSendMagicEffect, 400, table_left_pos, CONST_ME_SOUND_GREEN)
  addEvent(doSendMagicEffect, 700, table_left_pos, CONST_ME_SOUND_GREEN)
  addEvent(doCreatureSay, 500, npc, "You win!", TALKTYPE_SAY, false, 0)
  elseif (roll == 3 and random_rollval == 1) then
  placeMoney(total_g + (total_g * prize_percentl), table_middle_pos)
  addEvent(doSendMagicEffect, 400, table_left_pos, CONST_ME_SOUND_GREEN)
  addEvent(doSendMagicEffect, 700, table_left_pos, CONST_ME_SOUND_GREEN)
  addEvent(doCreatureSay, 500, npc, "You win!", TALKTYPE_SAY, false, 0)
  elseif (roll == 4 and random_rollval == 2) then
  placeMoney(total_g + (total_g * prize_percentl), table_middle_pos)
  addEvent(doSendMagicEffect, 400, table_left_pos, CONST_ME_SOUND_GREEN)
  addEvent(doSendMagicEffect, 700, table_left_pos, CONST_ME_SOUND_GREEN)
  addEvent(doCreatureSay, 500, npc, "You win!", TALKTYPE_SAY, false, 0)
  elseif (roll == 5 and random_rollval == 3) then
  placeMoney(total_g + (total_g * prize_percentl), table_middle_pos)
  addEvent(doSendMagicEffect, 400, table_left_pos, CONST_ME_SOUND_GREEN)
  addEvent(doSendMagicEffect, 700, table_left_pos, CONST_ME_SOUND_GREEN)
  addEvent(doCreatureSay, 500, npc, "You win!", TALKTYPE_SAY, false, 0)
  elseif (roll == 6 and random_rollval == 4) then
  placeMoney(total_g + (total_g * prize_percentl), table_middle_pos)
  addEvent(doSendMagicEffect, 400, table_left_pos, CONST_ME_SOUND_GREEN)
  addEvent(doSendMagicEffect, 700, table_left_pos, CONST_ME_SOUND_GREEN)
  addEvent(doCreatureSay, 500, npc, "You win!", TALKTYPE_SAY, false, 0)
  elseif (roll == 7 and random_rollval == 5) then
  placeMoney(total_g + (total_g * prize_percentl), table_middle_pos)
  addEvent(doSendMagicEffect, 400, table_left_pos, CONST_ME_SOUND_GREEN)
  addEvent(doSendMagicEffect, 700, table_left_pos, CONST_ME_SOUND_GREEN)
  addEvent(doCreatureSay, 500, npc, "You win!", TALKTYPE_SAY, false, 0)
  elseif (roll == 8 and random_rollval == 6) then
  placeMoney(total_g + (total_g * prize_percentl), table_middle_pos)
  addEvent(doSendMagicEffect, 400, table_left_pos, CONST_ME_SOUND_GREEN)
  addEvent(doSendMagicEffect, 700, table_left_pos, CONST_ME_SOUND_GREEN)
  addEvent(doCreatureSay, 500, npc, "You win!", TALKTYPE_SAY, false, 0)
  else
  addEvent(doSendMagicEffect, 400, table_left_pos, CONST_ME_BLOCKHIT)
  addEvent(doSendMagicEffect, 700, table_left_pos, CONST_ME_BLOCKHIT)
  addEvent(doCreatureSay, 500, npc, "Better luck next time.", TALKTYPE_SAY, false, 0)
   
  end
   
  doCreatureSay(npc, string.format("%s rolled a %d.", getCreatureName(npc), random_rollval), TALKTYPE_ORANGE_1, false, 0, table_left_pos)
  else
  addEvent(doCreateItem, 100, 2160, cc_count, table_middle_pos)
  addEvent(doCreateItem, 150, 2152, pc_count, table_middle_pos)
  doCreatureSay(npc, "The minimum wager is 5K and the maximum wager is 300K.", TALKTYPE_SAY, false, 0)
  end
  return true
end
function creatureSayCallback(cid, type, msg)
  -- NPC userdata instance
  local npc = getNpcCid()
  -- Participating player userdata instance
  local position = {x = getNpcPos().x+2, y = getNpcPos().y, z = getNpcPos().z}
  position.stackpos = STACKPOS_TOP_CREATURE
  local player_uid = getThingfromPos(position).uid
  -- Game table position userdata instances
  local table_left_pos = {x = position.x - 2, y = position.y - 1, z = position.z}
  local table_middle_pos = {x = position.x - 1, y = position.y - 1, z = position.z}
  -- Search for coins on the left and middle tables and create item userdata instances
  -- Other variables
  local cc_count = 0
  local pc_count = 0
  local ROLL, LOW, HIGH, ROL1, ROL2, ROL3, ROL4, ROL5, ROL6 = 0, 1, 2, 3, 4, 5, 6, 7, 8

  if (player_uid == cid) then
  if ((msgcontains(string.lower(msg), 'high') or msgcontains(string.lower(msg), 'h')) or msgcontains(string.lower(msg), '456')) then
  ROLL = HIGH
  elseif ((msgcontains(string.lower(msg), 'low') or msgcontains(string.lower(msg), 'l')) or msgcontains(string.lower(msg), '123')) then
  ROLL = LOW
  elseif msgcontains(string.lower(msg), '1') then
  ROLL = ROL1
  elseif msgcontains(string.lower(msg), '2') then
  ROLL = ROL2
  elseif msgcontains(string.lower(msg), '3') then
  ROLL = ROL3
  elseif msgcontains(string.lower(msg), '4') then
  ROLL = ROL4
  elseif msgcontains(string.lower(msg), '5') then
  ROLL = ROL5
     elseif msgcontains(string.lower(msg), '6') then
  ROLL = ROL6
  else
  return false
  end

     while getTileItemById(table_left_pos, 2160).uid ~= 0 do
       cc_count = cc_count + getTileItemById(table_left_pos, 2160).type
       doRemoveItem(getTileItemById(table_left_pos, 2160).uid)
     end
     
     while getTileItemById(table_left_pos, 2152).uid ~= 0 do
       pc_count = pc_count + getTileItemById(table_left_pos, 2152).type
       doRemoveItem(getTileItemById(table_left_pos, 2152).uid)
     end
       
     while getTileItemById(table_middle_pos, 2160).uid ~= 0 do
       cc_count = cc_count + getTileItemById(table_middle_pos, 2160).type
       doRemoveItem(getTileItemById(table_middle_pos, 2160).uid)
     end
     
     while getTileItemById(table_middle_pos, 2152).uid ~= 0 do
       pc_count = pc_count + getTileItemById(table_middle_pos, 2152).type
       doRemoveItem(getTileItemById(table_middle_pos, 2152).uid)
     end
     
  addEvent(rollDice, 500, ROLL, cc_count, pc_count, table_left_pos, table_middle_pos, npc)
  else
  return false
  end
  return true
end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
 
Last edited:
Lua Script Error: [Npc interface]
data/npc/scripts/dice_gamble.lua:eek:nCreatureSay
data/npc/scripts/dice_gamble.lua:129: attempt to call global 'getTileItemById' (
a nil value)
stack traceback:
[C]: in function 'getTileItemById'
data/npc/scripts/dice_gamble.lua:129: in function 'callback'
data/npc/lib/npcsystem/npchandler.lua:410: in function 'onCreatureSay'
data/npc/scripts/dice_gamble.lua:6: in function <data/npc/scripts/dice_g
amble.lua:6>

1.0 TFS
 
Code:
function getTileItemById(position, itemId, ...)
     local t = Tile(position)
     if t == nil then
         return pushThing(nil)
     end
     return pushThing(t:getItemById(itemId, ...))
end
https://github.com/otland/forgottenserver/blob/master/data/compat.lua
You can add compat.lua and add this at the top of global.lua: dofile('data/compat.lua')
Or change the functions to metatables and use compat.lua as example how to do it.
 
does this will work for 0.3.6/0.3.7 8.60 client ?
 
how do i convert it? could you please explain ?
 
Back
Top