v1.4
版本发布时间: 2021-09-18 07:23:48
otland/forgottenserver最新发布版本:v1.6(2024-06-06 06:09:08)
Engine
- added support for POSIX signals (new:
SIGINT
,SIGTERM
,SIGHUP
andSIGUSR1
) - better handling of configmanager class
- better handling of item attribute types
- improved dispatcher performance
- improved OTBM loader performance
- improved loading
items.xml
performance - improved getSpectators performance
- improved XTEA performance
- private RSA key is now being loaded from a PEM file
- scheduler ignores empty tasks now
Source code
- added
override
attribute wherever applicable - adjusted code formatting
- adjusted construction of messages for dealt/received damage
- anonymous namespaces are now being used wherever applicable
- chaseMode uses
bool
now instead of enumeration - corrected many typos in strings and variable names
- events (actions, talkactions, movements, etc.) use smart pointers now
- guild rank now uses
shared_ptr
- improved blessings
get
/set
code - improved
LightInfo
handling - map search for types and effects
- monster loot now accepts count higher than
100
-
ProtocolGame::login
now loads players by id instead of name - removed a lot of unused and unnecessary code
- removed
final
attribute fromfinal
class methods - removed unused parameter
mana
from monsters and NPCs - replaced
forward_list
withvector
in creature walking - replaced
protected
visibility withprivate
forfinal
classes -
sendInventoryItems
now uses afor
loop - singletons now use return by reference
- skill cache is no longer used as
pow
performance is fast enough - standardized class and variable names
- standardized client viewport
- STL algorithms are now being used for vocation search by id
Project tools
- now compiling with C++17 by default
- added appveyor
- added docker
- improvements to cmake and visual studio project files
- moved from tfssdk to vcpkg
- fixed various compiling issues across all supported platforms
- new icon
New features
- account storage key/value
- buy with backpacks
- classic attackspeed
- configurable depot and vip limits
- custom item attributes
- customizable world light
- event callbacks
- hotkey equip
- improved bank system
- lua item description (disabled by defeault)
- lua
Party
methods - monsters drop loot in lua
- monsters walkback to spawn
- more getters for
ItemType
class - NPC trade using bank account
- NPC voice module (npc saying random lines, see #2932 for details)
- player direction is now stored in the database
- reintroduced
/attr
talkaction known from0.4
- separated group flags in
groups.xml
(no longer a single number) - spawns can now be set to create random monsters (see #3605 for details)
- special skills (leech and crit)
- store inbox
- towns are now cached in the database
- vocation specific kick times in case of lost connection
New options in config.lua
-
allowWalkthrough
-
classicAttackSpeed
-
cleanProtectionZones
-
defaultWorldLight
-
depotFreeLimit
-
depotPremiumLimit
-
forceMonsterTypesOnLoad
-
houseDoorShowPrice
-
houseOwnedByAccount
-
luaItemDesc
-
onlyInvitedCanMoveHouseItems
-
removeChargesFromPotions
-
removeOnDespawn
-
removeWeaponAmmunition
-
removeWeaponCharges
-
serverSaveCleanMap
-
serverSaveClose
-
serverSaveNotifyDuration
-
serverSaveNotifyMessage
-
serverSaveShutdown
-
showPlayerLogInConsole
-
vipFreeLimit
-
vipPremiumLimit
-
yellMinimumLevel
-
yellAlwaysAllowPremium
New enums
Ammo
-
AMMO_NONE
-
AMMO_BOLT
-
AMMO_ARROW
-
AMMO_SPEAR
-
AMMO_THROWINGSTAR
-
AMMO_THROWINGKNIFE
-
AMMO_STONE
-
AMMO_SNOWBALL
Condition
-
CONDITION_PARAM_DRUNKENNESS
-
CONDITION_PARAM_SPECIALSKILL_CRITICALHITCHANCE
-
CONDITION_PARAM_SPECIALSKILL_CRITICALHITAMOUNT
-
CONDITION_PARAM_SPECIALSKILL_LIFELEECHCHANCE
-
CONDITION_PARAM_SPECIALSKILL_LIFELEECHAMOUNT
-
CONDITION_PARAM_SPECIALSKILL_MANALEECHCHANCE
-
CONDITION_PARAM_SPECIALSKILL_MANALEECHAMOUNT
Magic effect
-
CONST_ME_EARLY_THUNDER
-
CONST_ME_RAGIAZ_BONECAPSULE
-
CONST_ME_CRITICAL_DAMAGE
-
CONST_ME_PLUNGING_FISH
Fight mode
-
FIGHTMODE_ATTACK
-
FIGHTMODE_BALANCED
-
FIGHTMODE_DEFENSE
Item attribute
-
ITEM_ATTRIBUTE_DECAYTO
-
ITEM_ATTRIBUTE_WRAPID
-
ITEM_ATTRIBUTE_STOREITEM
-
ITEM_ATTRIBUTE_ATTACK_SPEED
-
ITEM_ATTRIBUTE_CUSTOM
Item group
-
ITEM_GROUP_GROUND
-
ITEM_GROUP_CONTAINER
-
ITEM_GROUP_WEAPON
-
ITEM_GROUP_AMMUNITION
-
ITEM_GROUP_ARMOR
-
ITEM_GROUP_CHARGES
-
ITEM_GROUP_TELEPORT
-
ITEM_GROUP_MAGICFIELD
-
ITEM_GROUP_WRITEABLE
-
ITEM_GROUP_KEY
-
ITEM_GROUP_SPLASH
-
ITEM_GROUP_FLUID
-
ITEM_GROUP_DOOR
-
ITEM_GROUP_DEPRECATED
Item ids
-
ITEM_SHOPPING_BAG
-
ITEM_MAGICWALL_NOPVP
-
ITEM_WILDGROWTH_NOPVP
Message types
-
MESSAGE_GUILD
- White message in channel (+ channelId) -
MESSAGE_PARTY_MANAGEMENT
- White message in channel (+ channelId) -
MESSAGE_PARTY
- White message in channel (+ channelId)
Textcolor
-
TEXTCOLOR_ELECTRICPURPLE
-
TEXTCOLOR_PASTELRED
WieldInfo
-
WIELDINFO_NONE
-
WIELDINFO_LEVEL
-
WIELDINFO_MAGLV
-
WIELDINFO_VOCREQ
-
WIELDINFO_PREMIUM
Zone
-
ZONE_PROTECTION
-
ZONE_NOPVP
-
ZONE_PVP
-
ZONE_NOLOGOUT
-
ZONE_NORMAL
New XML attributes
Monster
-
canwalkonenergy
-
canwalkonfire
-
canwalkonpoison
-
challengeable
-
ignoreSpawnBlock
-
isBoss
items.xml
imbuements related:
-
criticalhitchance
-
criticalhitamount
-
lifeleechchance
-
lifeleechamount
-
manaleechchance
-
manaleechamount
other:
-
forceserialize
/forcesave
- saves unmoveable items like beds and carpets when put in house -
storeitem
- allows putting the item in store inbox -
initdamage
- damage dealt when stepping on field -
attackspeed
- attack speed -
elementholy
- holy resistance -
elementdeath
- death resistance
Quests.xml
-
ignoreendvalue
- boolean for mission field. Enabling it will keep the mission displayed when mission storage is higher than endvalue.
Vocations.xml
-
allowPvp
- (boolean) some vocations can have pvp disabled now -
noPongKickTime
- (unsigned int) amount of seconds to kick the player in case he loses the connection
RevScriptSys
A new way to create scripts has been implemented. It allows the developers to create mods they can drag and drop to data/scripts
. Example mods can be found in the same folder. Every file from that folder will load automatically. To disable loading a certain file, add a #
symbol at the beginning of file.
Supported constructors:
-
Action
-
CreatureEvent
-
GlobalEvent
-
MonsterType
-
MoveEvent
-
Party
-
Spell
-
TalkAction
-
Weapon
Events
- Added event callbacks. They're hooks for things located in
data/events
folder. Examples can be found indata/scripts/eventcallbacks
.
New events
-
Creature:onHear(speaker, words, type)
-
Monster:onDropLoot(corpse)
-
Monster:onSpawn(position, startup, artificial)
-
Player:onItemMoved(item, count, fromPosition, toPosition, fromCylinder, toCylinder)
-
Player:onTradeCompleted(target, item, targetItem, isSuccess)
-
Player:onWrapItem(item, position)
New functions
-
isNumber(str)
- same astonumber(str)
but returnsfalse
instead ofnil
-
isValidMoney(money)
-
getLootRandom()
-
getMoneyCount(string)
-
getMoneyWeight(money)
-
getSubTypeName(subType)
-
logCommand(player, words, param)
- logs talkaction to a file -
setWorldLight(level, color)
New methods
Combat
-
combat:getPositions(creature, variant)
-
combat:getTargets(creature, variant)
-
combat:clearConditions()
-
combat:getParameter(key)
Condition
-
condition:getParameter(key)
Container
-
container:createLootItem(item)
-
container:getItems(recursive)
Creature
-
creature:isImmune()
-
creature:move(direction)
- moves creature to selected direction -
creature:hasCondition(conditionType[, subId = 0])
- checks if creature has specified condition -
creature:isContainer()
-
creature:isTeleport()
-
creature:setHealth(health)
-
creature:canAccessPz()
-
creature:isMovementBlocked()
-
creature:setMovementBlocked(state)
Game
-
Game.getClientVersion()
- returns a table with fieldsmin
,max
andstring
-
Game.getMonsterTypes()
-
Game.getItemAttributeByName(name)
-
Game.getAccountStorageValue(accountId, key)
-
Game.setAccountStorageValue(accountId, key, value)
-
Game.saveAccountStorageValues()
Group
-
group:hasFlag(flag)
House
-
house:getItems()
-
house:save()
-
house:getDoorIdByPosition(position)
-
house:canEditAccessList(listId, player)
-
house:kickPlayer(player, targetPlayer)
Item
-
item:isLoadedFromMap()
-
item:isMonster()
-
item:isNpc()
-
item:isStoreItem()
-
item:setStoreItem(bool storeItem)
-
itemType:isStoreItem()
-
item:getCustomAttribute(key)
-
item:setCustomAttribute(key, value)
-
item:removeCustomAttribute(key)
-
item:getSpecialDescription()
ItemType
-
itemType:isBlocking()
-
itemType:isGroundTile()
-
itemType:isMagicField()
-
itemType:isUseable()
-
itemType:isPickupable()
-
itemType:getAmmoType()
-
itemType:getCorpseType()
-
itemType:getGroup()
-
itemType:getAbilities()
-
itemType:hasShowAttributes()
-
itemType:hasShowCount()
-
itemType:hasShowCharges()
-
itemType:hasShowDuration()
-
itemType:hasAllowDistRead()
-
itemType:getWieldInfo()
-
itemType:getDuration()
-
itemType:getLevelDoor()
-
itemType:getVocationString()
-
itemType:getMinReqLevel()
-
itemType:getMinReqMagicLevel()
Monster
-
monster:rename(name[, nameDescription])
NetworkMessage
-
networkMessage:seek(position)
-
networkMessage:tell()
-
networkMessage:len()
Outfit
-
Outfit(looktype)
- meant to compareoutfit1 == outfit2
Player
-
player:hasChaseMode()
-
player:hasSecureMode()
-
player:getFightMode()
-
player:hasFlag(flag)
-
player:canWearOutfit(looktype)
-
player:getZone()
-
player:getSpecialSkill(specialSkillType)
-
player:addSpecialSkill(specialSkillType, value)
-
player:transferMoneyTo(target, amount)
-
player:withdrawMoney(amount)
-
player:depositMoney(amount)
-
player:getPremiumEndsAt()
-
player:setPremiumEndsAt(timestamp)
-
player:setPremiumTime(seconds)
-
player:addPremiumTime(seconds)
-
player:removePremiumTime(seconds)
-
player:getPremiumTime()
-
player:addLevel(amount, round)
-
player:addMagicLevel(value)
-
player:addSkill(skillId, value, round)
-
player:getWeaponType()
-
player:sendHouseWindow(house, listId)
-
player:setEditHouse(house, listId)
-
player:removeSkillTries(skillType, tries[, notify = true])
-
player:removeManaSpent(amount[, notify = true])
Position
-
position:isWalkable(condition)
-
position:isInRange(fromPos, toPos)
Spell
-
spell:runeLevel(level)
-
spell:runeMagicLevel(magLevel)
String
-
string.splitTrimmed(string, separator)
- works as a combination ofstring.split(str, sep)
andstring.trim(str)
, can also be called astext:splitTrimmed(sep)
Table
-
table.contains(table, value)
- same asisInArray(t, v)
Tile
-
tile:isWalkable(condition)
-
tile:addItem(itemId, count)
-
tile:addItemEx(item[, flags = 0])
-
tile:remove()
Vocation
-
vocation:allowsPvp()
Changes in datapack
- Added
allowDistRead
attribute to many signs and statues (items.xml
) - Added more groups. To get full access now you need account type
6
and group id6
- Added spell words to runes when looking at them
- Updated
forgotten.otbm
to version10.98
- Updated monsters and
items.xml
Added and updated lots of Lua scripts up to version 10.98
- added achievements system
- added enchanting system
- updated taming system
- new weapons and equipment statistics
- house carpets
- ferumbras items
- gold converter
- scroll of ascension
- costume bags
- premium scroll
- secret service tool gears
- blessing charms
- lootboxes (christmas bundles, surprise bags, gnomish package, etc)
- skinning (obsidian knife, blessed wooden stake)
- rust remover
- juice squeezer
- afflicted outfit related items
- large seashell
- wall mirror
- snow heap
- dolls
- sweetheart ring
- spider egg
- fire bug
- water pipe
- music instruments
- lottery ticket
- clay lump
- 8.1 april fools items
- sugar oat
- rum distilling
- goldfish bowl
- white deer death scripts
- missing food ids
- daily crate loot
- muck remover
- saw (for wooden ties)
- watering flower pots
- swamp digging
- hive gate teleporting
- gnomish vouchers
- items displaying blessings
- claw of the noxious spawn
- roasting meat on campfire
- ice flower harvesting
- insectoid cell
- banker npc
- juicy roots harvesting
- painted gourd rattle
- perppermoon bells
- ice fishing
- beds (added "this bed cannot be used message")
Adjusted Lua scripts
- added a message to citizen teleport
- added level and premium config for
!buyhouse
command - added missing astro clock, sundial and very noble looking watch to the watch script
- added missing rope spots (up to
10.98
) - added more swimmable tiles
- added new potions up to
10.98
- added
isPremium
check to ship captain NPC - code improvements for
/looktype
- fixed console warnings when the player is misusing rope
- fixed post startup rng by calling
math.randomseed(os.time())
as early as possible - fixed
promotion.lua
bug that made players with no vocation promoted - fixed wrong fluids behaviour when moving between fluid containers
- improved ip ban system
- improved the code behind curse condition
- improved
!online
and fixed ghost mode handling - moved windows and doors to revscripts
- NPC system now warns when a NPC sells something for lower price than he buys
- pick now works with shiny stone
- reworked
utori
spells - shortened and improved party spells code
- spellbooks now show params if spells have one
- updated door locking mechanism
- updated healing/mana color and messages
- updated message types for quests and doors
Code quality improvements (Lua)
- changed
nil
checks tonot
checks - removed unnecessary
nil
checks - fixed typos and whitespaces
- replaced
isInArray
withtable.contains
- renamed
combat:setCondition
tocombat:addCondition
- adjusted scripts to avoid using compat functions
Moved to lua
Commands
- All commands are talkactions now. As
commands.xml
is no longer needed, it got removed. -
/reload
-
/raid
-
!sellhouse
Spells
- find person (
exiva
) - house access management spells
- creature illusion (
utevo res ina
) - summon creature (
utevo res
) - levitate (
exani hur
) - chameleon rune (
adevo ina
) - convince creature rune (
adeta sio
) - runemaking
Other:
-
doSet...Outfit
-
table.contains
(formerly known asisInArray
) - bug reporting
- rule violation reporting
- transform
- decay
- party shared xp formula
- monster loot dropping
- experience stages
- item descriptions (needs enabling in
config.lua
)
Bugfixes
Server
- actions can now be grouped with
;
separator - added a few missing
lua_pop
instructions toluascript.cpp
- added a console warning when monster paralyze is trying to go above the limit
- added a console warning when
vocations.xml
file has unrecognized XML attributes - added backwards compatibility for
<inside>
tag in monster loot - added pushable flag to NPCs
-
config.lua
is now generated fromconfig.lua.dist
if the former can't be loaded -
creature:removeCondition
now supports userdata - direction checking methods now read
DIRECTION_NONE
instead ofDIRECTION_NORTHWEST
when both positions are equal - enforced
utf-8
encoding in the database - fixed a bug with items not being removed in
Game::internalRemoveItem
- fixed a crash caused by calling
addEvent(function() end)
- fixed a crash caused by closing the server on Windows
- fixed a crash caused by
creature:setMaster
- fixed a crash caused by inability to find map specified in
config.lua
- fixed a crash caused by registering same creaturescript twice on a single creature
- fixed a crash caused by relogging after putting an item on depot (Linux)
- fixed a crash caused by targeting already removed creature in rare situations (see #2582 for details)
- fixed a crash in token time parsing
- fixed a crash on Windows when using 2FA
- fixed a crash possible to happen during RSA decryption
- fixed a crash related to monsters with
onPrepareDeath
event dying from a condition - fixed a crash related to map cleaning
- fixed a crash when the spectator can't see the position in
removeTileCreature
- fixed a crash with
combat:execute(combat, variant)
- fixed a login error caused by enabling
freepremium
- fixed a loop in
player:getInstantSpells()
- fixed a missing call to
onTargetCombat
incombat.cpp
- fixed an issue with double
onEquip
execution. An extra parameterisCheck
was added. - fixed an issue with house doors not being unique in the database
- fixed an issue with
LuaJIT
being detected twice - fixed
combatBlockHit
not usingignoreResistances
flag - fixed bugs, freezes and crashes related to
/i
talkaction andGame.createItem
- fixed data race in scheduler
- fixed handling creatures that fall into interlocked teleports
- fixed memory leaks in talkactions and NPC system
- fixed monsters with conditions not becoming idle
- fixed multiple crashes, bugs and memory leaks caused by
/reload
- fixed multiple crashes caused by passing nil to some functions (see #3562 for details)
- fixed waitlist getting stuck
- fluids now use ids under
100
initems.xml
- improved
:getPluralName
- improved premium time handling
- monsters can no longer be set to have
healthNow
higher thanhealthMax
in their XML file - new limits to spawn time: min
10
seconds, max1
day - nonpvp walls and growths now disappear when stepped on
- NPCs are now in idle state when no players are nearby
- removed unnecessary shoplist update in NPC system
Lua functions:
-
doPlayerAddManaSpent
anddoPlayerAddSkillTry
no longer multiply the amount by skill rates - fixed
player:getClosestFreePosition
behaviour - fixed incorrect gold stacks detection in
player:removeMoney
-
container:addItem
no longer limitssubType
to100
- fixed issues with
pushMovement
increature:teleportTo
- fixed
Player:onMoveItem
not being called when using items from the ground - fixed
Player:onMoveItem
not being called when switching items in the inventory - new implementation of
onManaChange
- new flags in target/tile combat:
blockedByArmor
,blockedByShield
,ignoreResistances
-
player:addMount
,player:hasMount
andplayer:removeMount
now support mount name string -
Player
constructor now allows GUID -
player:showTextDialog
now acceptsItem
userdata - premium time is now updated on character login
- promoted vocations are no longer needed in
weapons.xml
Client
- fixed a client crash when
creature:say
has missingtype
- fixed a client crash when displaying more than
7
players on one tile - fixed a client crash when opening unnamed (item of type ...) containers
- fixed incorrect distance effect path when player gets teleported with
onPrepareDeath
script - fixed issues with disabled action bars in some clients
- fixed light sources not working in arrow slot
- fixed multiple client crashes on "set outfit" window requests
- premium status now displays correctly in character list
- fixed market not recognizing items from cancelled offers
- fixed mount issues with GM outfit (see #2028 for details)
- fixed trade window being stuck in some situations
Gameplay
- added black skull limitations
- added stairhop exhaustion for spells
- adjusted player corpse descriptions
- blood splashes caused by physical damage no longer spill in PZ tiles
- bonus magic level is no longer counted for % magic level buff condition
- browse field no longer shows items marked with special
uniqueId
- challenged creatures no longer run away on low health
- changed wrap/unwrap to be for house owners only
- corrected inaccurate sight lines for throwing items and attacks
- corrected intervals for bleeding and poison
- default cap for new characters is
400
now - default
townId
for new characters is1
now - fixed a bug that caused players to stay on trainers when they exit the client with targeted creature
- fixed a bug with wall runes not working diagonally
- fixed a bug with elemental damage reduction not working in some situations
- fixed a pick being able to make holes anywhere
- fixed
aleta grav
not working on closed doors - fixed
allowfaruse
not working - fixed an overflow in
skullTicks
- fixed blood rage spell behaviour
- fixed bypassing disabled browse field with arrow up icon
- fixed conditions not being applied when drinking fluids
- fixed count message for hotkey actions
- fixed decay not working in some scenarios
- fixed direction not updating when changing floor using parcels trick
- fixed disappearing depot items when player never opened his depot yet
- fixed disappearing items after trade bug
- fixed inability to cast spells in front of a wall
- fixed inability to cast spells when muted
- fixed inability to talk in NPC channel when muted
- fixed inability to switch floors with stacked parcels in some situations
- fixed inaccurate player defense formula
- fixed inaccurate viplist behaviour
- fixed incorrect behaviour of pyramid corners
- fixed invisibility interaction with ghost mode
- fixed issues related to buying fluids through NPC trade
- fixed missing attributes display on bows crossbows
- fixed monster
lookDirection
when facing the target diagonally - fixed monsters interaction with fields
- fixed pagination in sendAddContainerItem
- fixed potential yellow skull bug (see #2072)
- fixed problems with opening containers on a tile with many of them
- fixed problems with auto stacking system
- fixed reading player skill values when equipped with weapons with ammo
- fixed shared experience triggering and formula bugs
- fixed skills not going up when being exactly at zero tries of starting level
- fixed stacking items with modified attributes
- fixed stored vocation regeneration not updating
- fixed traps not dealing damage
- fixed unintentionally reduced PVP healing
- fixed "use" option not working in "browse field" after an item was moved
- fluid containers in loot are now empty by default instead of having water
- heal friend (
exura sio
) has proper range now - house access lists can now read guild ranks
- improved two handed weapons equipping mechanic
- improved experience formula - now allows
1034406
max level - improved
player:getDeathPenalty()
precision - keys now use four digits to display the number (eg
0021
instead of just21
) - magic fields are no longer impossible to replace
- monster aggro no longer gets triggered through ground floor
- monsters killed by other monsters now drop loot properly
- monsters no longer hit you instantly when you enter and leave pz fast
- monsters no longer paralyze themselves
- mute condition now saves on logout
- players can no longer invite themselves to a party
- players with low level pvp protection can now be walked through
- poison is no longer applied on missed hits
- removed the ability to message to yourself
- removed the ability to buy items from yourself at the market
- removed delay on monster death
- removed duplicate rent charge on
!buyhouse
- store outfits and mounts are no longer premium only
- summons inherit canPushItems flag (see #3462 for details)
- updated afk warning message
- updated cancel messages
- using items no longer cancels autowalk
- war players no longer have green skull
Security updates
- added token validation when connecting to the gameworld
- dropped support for regular expressions in house access lists
1、 tfs-v1.4-macos-clang-Release-luajit.zip 6.01MB
2、 tfs-v1.4-ubuntu-clang-Release-luajit.zip 6.89MB
3、 tfs-v1.4-windows-msvc-Release-luajit.zip 6.18MB