• 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!

More Script Issues [PLEASE HELP!]

aalqaq2

Trying to help, but I'm not too good at it.
Joined
Apr 10, 2017
Messages
112
Solutions
3
Reaction score
8
TFS Version 1.2 -- Client Version 10.98

I still have a few issues with my script and I'm not sure how to solve them.

1. if players bet = 1,000,000 (max), NPC (if you win) pays 1,000,100 [Supposed to pay 1,800,000 (80%) ]
2. If gold placed on NPC depot, NPC does not recognize it as a bet. (NPC y=-1) (Images below: Dice1.png works, Dice2.png does not work)

XML:
<?xml version="1.0" encoding="UTF-8"?>
<npc name="Thais Gambler" script="Dicer.lua" walkinterval="0" floorchange="0" walkStack="0">
<health now="100" max="100"/>
<look type="132" head="114" body="0" legs="0" feet="114" addons="3"/>
 <parameters>
  <parameter key="message_greet" value="Hello, |PLAYERNAME|. You can bet speaking {H} or {L}, the minimum wager is 1,000 and the maximum wager is 1,000,000." />
 </parameters>
</npc>

PHP:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}
 
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 voices = {
 { text = 'Place your wager! Test your luck!' },
 { text = 'One roll to win it all!' },
 { text = 'Hey, Are you feeling lucky?' }
}
npcHandler:addModule(VoiceModule:new(voices))
 
function delayMoneyRemoval(item, pos)
        doRemoveItem(getTileItemById(pos, item).uid)
        return true
end
 
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
 
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 total_new = (total_g * prize_percent)
 
        if ((total_g) <= 1000000 and (total_g) >= 1000) 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_new, 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_new, 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
    if ((total_g) <= 1000000 and (total_g) >= 1000) then
      addEvent(doCreateItem, 100, 2160, cc_count, table_middle_pos)
      addEvent(doCreateItem, 150, 2152, pc_count, table_middle_pos)
    end
                doCreatureSay(npc, "The minimum wager is 1,000 and the maximum wager is 1,000,000.", TALKTYPE_SAY, false, 0)
        end
        return true
end
 
function creatureSayCallback(cid, type, msg)
        -- NPC userdata instance
        local npc = getNpcCid()
 
        -- Game table position userdata instances
        local table_left_pos = {x = 32352, y = 32225, z = 7} -- North NPC Table Pos. (y+1)
        local table_middle_pos = {x = 32353, y = 32225, z = 7} -- Middle NPC Table Pos. (y+1,x+1)
 
        -- 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 = 0, 1, 2
        posplayer = {x=32354, y=32226, z=7} -- Players Position
                local ppos = getPlayerPosition(cid)
        if ppos.x == posplayer.x and ppos.y == posplayer.y then
        if isInArray({"H", "HIGH", "high", "h"}, msg) then
                        ROLL = HIGH
                elseif  isInArray({"L", "LOW", "l", "low"}, msg) then
                        ROLL = LOW           
                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)
npcHandler:addModule(FocusModule:new())
 

Attachments

Last edited:
The ( ) should fix the problem of add the 8% correctly and no pay 100+

I'm also having the issue of bet between 1-999 NPC will take the money and give error message. I only want him to give error message and not take money.

PHP:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}
 
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 voices = {
 { text = 'Place your wager! Test your luck!' },
 { text = 'One roll to win it all!' },
 { text = 'Hey, Are you feeling lucky?' }
}
npcHandler:addModule(VoiceModule:new(voices))
 
function delayMoneyRemoval(item, pos)
        doRemoveItem(getTileItemById(pos, item).uid)
        return true
end
 
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
 
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 total_new = (total_g * prize_percent)
 
        if ((total_g) <= 1000000 and (total_g) >= 1000) 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_new, 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_new, 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
    if ((total_g) <= 1000000 and (total_g) >= 1000) then
      addEvent(doCreateItem, 100, 2160, cc_count, table_middle_pos)
      addEvent(doCreateItem, 150, 2152, pc_count, table_middle_pos)
    end
                doCreatureSay(npc, "The minimum wager is 1,000 and the maximum wager is 1,000,000.", TALKTYPE_SAY, false, 0)
        end
        return true
end
 
function creatureSayCallback(cid, type, msg)
        -- NPC userdata instance
        local npc = getNpcCid()
 
        -- Game table position userdata instances
        local table_left_pos = {x = 32352, y = 32225, z = 7} -- North NPC Table Pos. (y+1)
        local table_middle_pos = {x = 32353, y = 32225, z = 7} -- Middle NPC Table Pos. (y+1,x+1)
 
        -- 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 = 0, 1, 2
        posplayer = {x=32354, y=32226, z=7} -- Players Position
                local ppos = getPlayerPosition(cid)
        if ppos.x == posplayer.x and ppos.y == posplayer.y then
        if isInArray({"H", "HIGH", "high", "h"}, msg) then
                        ROLL = HIGH
                elseif  isInArray({"L", "LOW", "l", "low"}, msg) then
                        ROLL = LOW           
                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)
npcHandler:addModule(FocusModule:new())
 

Attachments

Last edited:
The ( ) should fix the problem of add the 8% correctly and no pay 100+
You really love your parentheses ;)
Parentheses in a line of code are normally used to execute a calculation in a specific order these parentheses allow us to override the order of operations, but applying them just to apply them does not change the outcome of the formula.
Code:
local a = 2 + 2
print(a) -- will print 4
local a = (2 + 2)
print(a) -- will still print 4

Order of Operations
Code:
In mathematics and computer programming, the order of operations is a collection of rules that reflect conventions about which procedures to perform first in order to evaluate a given mathematical expression.
 
You really love your parentheses ;)
Parentheses in a line of code are normally used to execute a calculation in a specific order these parentheses allow us to override the order of operations, but applying them just to apply them does not change the outcome of the formula.
Code:
local a = 2 + 2
print(a) -- will print 4
local a = (2 + 2)
print(a) -- will still print 4

Order of Operations
Code:
In mathematics and computer programming, the order of operations is a collection of rules that reflect conventions about which procedures to perform first in order to evaluate a given mathematical expression.
I'm aware of that. lol. I figured I'd give it a shot anyway. I'm used to 'safe' coding so I tend to add parenthesis as precautions rather than necessities.
 
Last edited:
You really love your parentheses ;)
Parentheses in a line of code are normally used to execute a calculation in a specific order these parentheses allow us to override the order of operations, but applying them just to apply them does not change the outcome of the formula.
Code:
local a = 2 + 2
print(a) -- will print 4
local a = (2 + 2)
print(a) -- will still print 4

Order of Operations
Code:
In mathematics and computer programming, the order of operations is a collection of rules that reflect conventions about which procedures to perform first in order to evaluate a given mathematical expression.
@aalqaq2 yes bro. Thanks for that answer the other guy doesnt understand^^
 
Back
Top