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

Need help to fix NPC (he doesn't react to any keyword)

Lava Titan

Developer
Joined
Jul 25, 2009
Messages
1,571
Solutions
3
Reaction score
98
Location
Portugal
Hello I'm using this script but the NPC doesnt react to any word...

I think the issue is in this part:

Code:
if (player_uid ~= 0) then
player = Player(player_uid)
if ((msgcontains(string.lower(msg), 'high') and (player:isPlayer() and player:getId() == cid))) then
ROLL = HIGH
elseif ((msgcontains(string.lower(msg), 'low') and (player:isPlayer() and player:getId() == cid))) then
ROLL = LOW
else
return false
end

Code:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)

function onCreatureAppear(cid)                npcHandler:eek:nCreatureAppear(cid)             end
function onCreatureDisappear(cid)             npcHandler:eek:nCreatureDisappear(cid)         end
function onCreatureSay(cid, type, msg)         npcHandler:eek:nCreatureSay(cid, type, msg)     end
function onThink()                             npcHandler:eek:nThink()                         end
function onPlayerEndTrade(cid)                 npcHandler:OnPlayerEndTrade(cid)             end
function onPlayerCloseChannel(cid)             npcHandler:OnPlayerCloseChannel(cid)         end

local function delayMoneyRemoval(delayRemovedItem)
delayRemovedItem:remove(delayRemovedItem:getCount())
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%

if ((total_g) <= 300000 and (total_g) >= 5000) then
table_left_pos:sendMagicEffect(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(Position.sendMagicEffect, 400, table_left_pos, CONST_ME_SOUND_GREEN)
addEvent(Position.sendMagicEffect, 700, table_left_pos, CONST_ME_SOUND_GREEN)
elseif (roll == 2 and random_rollval >= 4) then
placeMoney(total_g + (total_g * prize_percent), table_middle_pos)
addEvent(Position.sendMagicEffect, 400, table_left_pos, CONST_ME_SOUND_GREEN)
addEvent(Position.sendMagicEffect, 700, table_left_pos, CONST_ME_SOUND_GREEN)
else
addEvent(Position.sendMagicEffect, 400, table_left_pos, CONST_ME_BLOCKHIT)
addEvent(Position.sendMagicEffect, 700, table_left_pos, CONST_ME_BLOCKHIT)
end
npc:say(string.format("%s rolled a %d.", npc:getName(), random_rollval), TALKTYPE_ORANGE_1, false, 0, npc:getPosition())
else
addEvent(doCreateItem, 100, 2160, cc_count, table_middle_pos)
addEvent(doCreateItem, 150, 2152, pc_count, table_middle_pos)
npc:say("The minimum wager is 5K and the maximum wager is 300K.", TALKTYPE_SAY, false, 0, npc:getPosition())
end
return true
end

function creatureSayCallback(cid, type, msg)
-- NPC userdata instance
local npc = Npc(getNpcCid())

-- Participating player userdata instance
local position = npc:getPosition() + {x = 2, y = 0, z = 0}
position.stackpos = STACKPOS_TOP_CREATURE
local player_uid = getThingfromPos(position).uid

-- Game table position userdata instances
local table_left_pos = Position(1004, 986, 5)
local table_middle_pos = Position(1005, 986, 5)

-- Search for coins on the left and middle tables and create item userdata instances
local table_left_cc_uid = getTileItemById(table_left_pos, 2160).uid
local table_middle_cc_uid = getTileItemById(table_middle_pos, 2160).uid
local table_left_pc_uid = getTileItemById(table_left_pos, 2152).uid
local table_middle_pc_uid = getTileItemById(table_middle_pos, 2152).uid

-- Other variables
local cc_count = 0
local pc_count = 0
local ROLL, LOW, HIGH = 0, 1, 2

if (player_uid ~= 0) then
player = Player(player_uid)
if ((msgcontains(string.lower(msg), 'high') and (player:isPlayer() and player:getId() == cid))) then
ROLL = HIGH
elseif ((msgcontains(string.lower(msg), 'low') and (player:isPlayer() and player:getId() == cid))) then
ROLL = LOW
else
return false
end
if (table_middle_cc_uid ~= 0) then
table_middle_cc = Item(table_middle_cc_uid)
cc_count = table_middle_cc:getCount()
table_middle_cc:moveTo(table_left_pos)
addEvent(delayMoneyRemoval, 300, table_middle_cc)
end
if (table_middle_pc_uid ~= 0) then
table_middle_pc = Item(table_middle_pc_uid)
pc_count = table_middle_pc:getCount()
table_middle_pc:moveTo(table_left_pos)
addEvent(delayMoneyRemoval, 300, table_middle_pc)
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)
 
it's 1.1 scripting.. but this part doesn't make sense?
Code:
if (player_uid ~= 0) then
player = Player(player_uid)
Shouldn't it be like..
Code:
if (player.uid ~= 0) then
player = Player(player.uid)
But really I'm only guessing.. I'm not really sure what's going on there. I don't work with 1.x
 
it's 1.1 scripting.. but this part doesn't make sense?
Code:
if (player_uid ~= 0) then
player = Player(player_uid)
Shouldn't it be like..
Code:
if (player.uid ~= 0) then
player = Player(player.uid)
But really I'm only guessing.. I'm not really sure what's going on there. I don't work with 1.x

I'm sorry but whats the difference between code 1 and code 2 that u posted? XD
 
@HalfAway

Code:
local table_left_pos = Position(1004, 986, 6) -- {x = 1004, y = 986, z = 6}
local table_middle_pos = Position(1005, 986, 6) -- {x = 1005, y = 986, z = 6}

NPC POS = (1004, 987, 6)
MY POS = 1006, 987, 6

oMcrbaU.png
 
Alright change this
Code:
local position = npc:getPosition() + {x = 2, y = 0, z = 0}
To this and see what happens
Code:
local npcPos = npc:getPosition()
local position = {x = npcPos.x + 2, y = npcPos.y, z = npcPos.z}
If it still doesn't work increase the 2 to a higher number 3, 4, etc
If it still doesn't work, are you using the proper distro for this script, are you using the proper keywords.. idk are you sure you didn't change anything in the npc library
 

Similar threads

Back
Top