For anyone who wants to use the new NPC system (lua based NPC's) proposed as a pr at current master branch (included in the upcoming 1.6 release)
I'll help you re write NPC's or create from scratch based on a detailed outline into the new NPC system.
There is 2 ways on how to request:
1) You post a file and I'll just 1:1 transfer it into the new system. (xml and lua file)
2) You write a very detailed version of the npc and what he should be capable of
You have to be prepared for them to be public domain, I'm not posting them in private and they will serve for other people as examples to understand how everything works.
For those who are interested into implementing this npc system into older tfs versions, here is the summarize of all commits which need to be applied:
Let's start off with something very simple, just a Merchant in different versions
I'll try my best to make some good commentary with showing some visual
I'll help you re write NPC's or create from scratch based on a detailed outline into the new NPC system.
There is 2 ways on how to request:
1) You post a file and I'll just 1:1 transfer it into the new system. (xml and lua file)
2) You write a very detailed version of the npc and what he should be capable of
You have to be prepared for them to be public domain, I'm not posting them in private and they will serve for other people as examples to understand how everything works.
For those who are interested into implementing this npc system into older tfs versions, here is the summarize of all commits which need to be applied:
[Revscriptsys] RevNpcSys version 1.0 (lua npcs / NpcType / new npc system) by EvilHero90 · Pull Request #4671 · otland/forgottenserver
Pull Request Prelude I have followed proper The Forgotten Server code styling. I have read and understood the contribution guidelines before making this PR. I am aware that this PR may be clo...
github.com
Post automatically merged:
Let's start off with something very simple, just a Merchant in different versions
I'll try my best to make some good commentary with showing some visual
branching
on where we are at which stage.
LUA:
-- creates the new npc type with the name "Merchant"
local npcType = Game.createNpcType("Merchant")
-- sets the speech bubble of the npc to a trade bubble
npcType:speechBubble(SPEECHBUBBLE_TRADE)
-- sets the outfit of the npc
npcType:outfit({lookType = 128, lookHead = 114, lookBody = 114, lookLegs = 114, lookFeet = 114})
-- sets the radius on how far the npc can move away from his spawn position
npcType:spawnRadius(2)
-- sets the interval on when the npc should walk in ms
npcType:walkInterval(2000)
-- sets the movement speed on how fast the npc moves
npcType:walkSpeed(100)
-- this does all the magic in the background, initializing the npc system (onAppear/onDisappear/onSay/onTradeRequest, etc.)
npcType:defaultBehavior()
-- creates a new instance of the NpcsHandler class with the npcType
-- this holds all the tree & branch data for the npc
local handler = NpcsHandler(npcType)
-- creating the greeting keywords for the npc, handler.greetWords defaults to a table which can be found in constants.lua or can be overwritten by calling handler:setGreetWords({"word1", "word2", "word3"})
local greet = handler:keyword(handler.greetWords)
-- sets the response of the npc when the player greets him
greet:setGreetResponse("Hello |PLAYERNAME|! I have some fine {weapons} and {shields} for sale.")
--[[
our current tree structure of the npc looks likes this
greet
|- nothing
as we have no keywords after greeting yet
]]
-- creating the keyword "weapons" for the npc
-- this adds now a keyword onto the greet keyword
local weapons = greet:keyword("weapons")
-- sets the response of the npc when the player asks for weapons
weapons:respond("You want to see my fine weapons I offer?.")
--[[
our current tree structure of the npc looks likes this
greet
|- weapons
we placed the keyword "weapons" onto greet
]]
-- creating the keyword "yes" which will now show us the shop with teh weapons
local accept = weapons:keyword("yes")
-- sets the response of the npc when the player says "yes"
accept:respond("Here are my weapons.")
-- this will show the shop with the id 1 now, I'll show at the end of the example on how to make a shop
accept:shop(1)
--[[
our current tree structure of the npc looks likes this
greet
|- weapons
|- yes
|- show shop with id 1
we placed the keyword "yes" onto weapons
]]
-- creating the keyword "no" which will now lead us back to the greet keyword tree (resetting the talk state)
local decline = weapons:keyword("no")
-- sets the response of the npc when the player says "no"
decline:respond("Ok then, not.")
-- if you wanted the npc now to directly ungreet the player you could call decline:farewell() here which would be like saying "bye" to the npc
--[[
our current tree structure of the npc looks likes this
greet
|- weapons
|- yes
| |- show shop with id 1
|- no
|- reset talk state
we placed the keyword "no" onto weapons
]]
-- creating the keyword "shields" for the npc
local shields = greet:keyword("shields")
-- sets the response of the npc when the player asks for shields
shields:respond("You want to see my fine shields I offer?.")
--[[
our current tree structure of the npc looks likes this
greet
|- weapons
| |- yes
| | |- show shop with id 1
| |- no
| |- reset talk state to greet
|- shields
we placed the keyword "shields" onto greet
]]
-- creating the keyword "yes" which will now show us the shop with the shields
local accept = shields:keyword("yes")
-- sets the response of the npc when the player says "yes"
accept:respond("Here are my shields.")
-- this will show the shop with the id 2 now, I'll show at the end of the example on how to make a shop
accept:shop(2)
--[[
our current tree structure of the npc looks likes this
greet
|- weapons
| |- yes
| | |- show shop with id 1 (weapons)
| |- no
| |- reset talk state to greet
|- shields
|- yes
|- show shop with id 2 (shields)
we placed the keyword "yes" onto shields
]]
-- creating the keyword "no" which will now lead us back to the greet keyword tree (resetting the talk state)
local decline = shields:keyword("no")
-- sets the response of the npc when the player says "no"
decline:respond("Ok then, not.")
-- if you wanted the npc now to directly ungreet the player you could call decline:farewell() here which would be like saying "bye" to the npc
--[[
our current tree structure of the npc looks likes this
greet
|- weapons
| |- yes
| | |- show shop with id 1
| |- no
| |- reset talk state to greet
|- shields
|- yes
| |- show shop with id 2
|- no
|- reset talk state to greet
we placed the keyword "no" onto shields
]]
-- creating the shop with the id 1 for the npc (shields)
local shop1 = NpcShop(npcType, 1)
-- example of adding a single item to the shop (id/name, buyPrice, sellPrice, subType)
shop1:addItem("sword", 100, 25)
-- example of adding multiple items to the shop (id/name, buyPrice, sellPrice, subType)
local exWeapons = {
["axe"] = {buy = 150, sell = 50},
["club"] = {buy = 50, sell = 10},
["dagger"] = {buy = 75, sell = 20},
["mace"] = {buy = 200, sell = 75},
["spear"] = {buy = 100, sell = 30},
["staff"] = {buy = 250, sell = 100},
["sword"] = {buy = 100, sell = 25}
}
shop1:addItems(exWeapons)
-- example of adding discount to the shop for a specific type of %
-- this will reduce the buy price of all items by 10% if the player has the storagevalue 9999 set to 1 or higher
shop1:addDiscount(9999, 10)
-- creating the shop with the id 2 for the npc (shields)
local shop2 = NpcShop(npcType, 2)
-- example of adding a single item to the shop (id/name, buyPrice, sellPrice, subType)
shop2:addItem("shield", 100, 25)
-- example of adding multiple items to the shop (id/name, buyPrice, sellPrice, subType)
local exShields = {
["shield"] = {buy = 100, sell = 25},
["wooden shield"] = {buy = 50, sell = 10},
["brass shield"] = {buy = 150, sell = 50},
["plate shield"] = {buy = 200, sell = 75},
["steel shield"] = {buy = 250, sell = 100}
}
shop2:addItems(exShields)
-- example of adding discount to the shop for a % depending on storagevalue 9998 value
-- this will reduce the buy price of all items by x% if the player has the storagevalue 9998 set between a number of 1 and 100
shop2:addDiscount(9998)
Last edited: