A free and open-source MMORPG server emulator written in C++
Version 1.4.* represents our latest stable protocol 10.98 release.
Full Changelog: https://github.com/otland/forgottenserver/compare/v1.4.1...v1.4.2
Version 1.4.* represents our latest stable protocol 10.98 release.
This release contains some bugfixes.
Full Changelog: https://github.com/otland/forgottenserver/compare/v1.4...v1.4.1
SIGINT
, SIGTERM
, SIGHUP
and SIGUSR1
)items.xml
performanceoverride
attribute wherever applicablebool
now instead of enumerationshared_ptr
get
/set
codeLightInfo
handling100
ProtocolGame::login
now loads players by id instead of namefinal
attribute from final
class methodsmana
from monsters and NPCsforward_list
with vector
in creature walkingprotected
visibility with private
for final
classessendInventoryItems
now uses a for
looppow
performance is fast enoughParty
methodsItemType
class/attr
talkaction known from 0.4
groups.xml
(no longer a single number)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
AMMO_NONE
AMMO_BOLT
AMMO_ARROW
AMMO_SPEAR
AMMO_THROWINGSTAR
AMMO_THROWINGKNIFE
AMMO_STONE
AMMO_SNOWBALL
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
CONST_ME_EARLY_THUNDER
CONST_ME_RAGIAZ_BONECAPSULE
CONST_ME_CRITICAL_DAMAGE
CONST_ME_PLUNGING_FISH
FIGHTMODE_ATTACK
FIGHTMODE_BALANCED
FIGHTMODE_DEFENSE
ITEM_ATTRIBUTE_DECAYTO
ITEM_ATTRIBUTE_WRAPID
ITEM_ATTRIBUTE_STOREITEM
ITEM_ATTRIBUTE_ATTACK_SPEED
ITEM_ATTRIBUTE_CUSTOM
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_SHOPPING_BAG
ITEM_MAGICWALL_NOPVP
ITEM_WILDGROWTH_NOPVP
MESSAGE_GUILD
- White message in channel (+ channelId)MESSAGE_PARTY_MANAGEMENT
- White message in channel (+ channelId)MESSAGE_PARTY
- White message in channel (+ channelId)TEXTCOLOR_ELECTRICPURPLE
TEXTCOLOR_PASTELRED
WIELDINFO_NONE
WIELDINFO_LEVEL
WIELDINFO_MAGLV
WIELDINFO_VOCREQ
WIELDINFO_PREMIUM
ZONE_PROTECTION
ZONE_NOPVP
ZONE_PVP
ZONE_NOLOGOUT
ZONE_NORMAL
canwalkonenergy
canwalkonfire
canwalkonpoison
challengeable
ignoreSpawnBlock
isBoss
imbuements related:
criticalhitchance
criticalhitamount
lifeleechchance
lifeleechamount
manaleechchance
manaleechamount
other:
forceserialize
/forcesave
- saves unmoveable items like beds and carpets when put in housestoreitem
- allows putting the item in store inboxinitdamage
- damage dealt when stepping on fieldattackspeed
- attack speedelementholy
- holy resistanceelementdeath
- death resistanceignoreendvalue
- boolean for mission field. Enabling it will keep the mission displayed when mission storage is higher than endvalue.allowPvp
- (boolean) some vocations can have pvp disabled nownoPongKickTime
- (unsigned int) amount of seconds to kick the player in case he loses the connectionA 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
data/events
folder. Examples can be found in data/scripts/eventcallbacks
.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)
isNumber(str)
- same as tonumber(str)
but returns false
instead of nil
isValidMoney(money)
getLootRandom()
getMoneyCount(string)
getMoneyWeight(money)
getSubTypeName(subType)
logCommand(player, words, param)
- logs talkaction to a filesetWorldLight(level, color)
combat:getPositions(creature, variant)
combat:getTargets(creature, variant)
combat:clearConditions()
combat:getParameter(key)
condition:getParameter(key)
container:createLootItem(item)
container:getItems(recursive)
creature:isImmune()
creature:move(direction)
- moves creature to selected directioncreature:hasCondition(conditionType[, subId = 0])
- checks if creature has specified conditioncreature:isContainer()
creature:isTeleport()
creature:setHealth(health)
creature:canAccessPz()
creature:isMovementBlocked()
creature:setMovementBlocked(state)
Game.getClientVersion()
- returns a table with fields min
, max
and string
Game.getMonsterTypes()
Game.getItemAttributeByName(name)
Game.getAccountStorageValue(accountId, key)
Game.setAccountStorageValue(accountId, key, value)
Game.saveAccountStorageValues()
group:hasFlag(flag)
house:getItems()
house:save()
house:getDoorIdByPosition(position)
house:canEditAccessList(listId, player)
house:kickPlayer(player, targetPlayer)
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: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:rename(name[, nameDescription])
networkMessage:seek(position)
networkMessage:tell()
networkMessage:len()
Outfit(looktype)
- meant to compare outfit1 == outfit2
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:isWalkable(condition)
position:isInRange(fromPos, toPos)
spell:runeLevel(level)
spell:runeMagicLevel(magLevel)
string.splitTrimmed(string, separator)
- works as a combination of string.split(str, sep)
and string.trim(str)
, can also be called as text:splitTrimmed(sep)
table.contains(table, value)
- same as isInArray(t, v)
tile:isWalkable(condition)
tile:addItem(itemId, count)
tile:addItemEx(item[, flags = 0])
tile:remove()
vocation:allowsPvp()
allowDistRead
attribute to many signs and statues (items.xml
)6
and group id 6
forgotten.otbm
to version 10.98
items.xml
10.98
!buyhouse
command10.98
)10.98
isPremium
check to ship captain NPC/looktype
math.randomseed(os.time())
as early as possiblepromotion.lua
bug that made players with no vocation promoted!online
and fixed ghost mode handlingutori
spellsnil
checks to not
checksnil
checksisInArray
with table.contains
combat:setCondition
to combat:addCondition
commands.xml
is no longer needed, it got removed./reload
/raid
!sellhouse
exiva
)utevo res ina
)utevo res
)exani hur
)adevo ina
)adeta sio
)doSet...Outfit
table.contains
(formerly known as isInArray
)config.lua
);
separatorlua_pop
instructions to luascript.cpp
vocations.xml
file has unrecognized XML attributes<inside>
tag in monster lootconfig.lua
is now generated from config.lua.dist
if the former can't be loadedcreature:removeCondition
now supports userdataDIRECTION_NONE
instead of DIRECTION_NORTHWEST
when both positions are equalutf-8
encoding in the databaseGame::internalRemoveItem
addEvent(function() end)
creature:setMaster
config.lua
onPrepareDeath
event dying from a conditionremoveTileCreature
combat:execute(combat, variant)
freepremium
player:getInstantSpells()
onTargetCombat
in combat.cpp
onEquip
execution. An extra parameter isCheck
was added.LuaJIT
being detected twicecombatBlockHit
not using ignoreResistances
flag/i
talkaction and Game.createItem
/reload
100
in items.xml
:getPluralName
healthNow
higher than healthMax
in their XML file10
seconds, max 1
daydoPlayerAddManaSpent
and doPlayerAddSkillTry
no longer multiply the amount by skill ratesplayer:getClosestFreePosition
behaviourplayer:removeMoney
container:addItem
no longer limits subType
to 100
pushMovement
in creature:teleportTo
Player:onMoveItem
not being called when using items from the groundPlayer:onMoveItem
not being called when switching items in the inventoryonManaChange
blockedByArmor
, blockedByShield
, ignoreResistances
player:addMount
, player:hasMount
and player:removeMount
now support mount name stringPlayer
constructor now allows GUIDplayer:showTextDialog
now accepts Item
userdataweapons.xml
creature:say
has missing type
7
players on one tileonPrepareDeath
scriptuniqueId
400
nowtownId
for new characters is 1
nowaleta grav
not working on closed doorsallowfaruse
not workingskullTicks
lookDirection
when facing the target diagonallyexura sio
) has proper range now1034406
max levelplayer:getDeathPenalty()
precision0021
instead of just 21
)!buyhouse
This is the third stable release of The Forgotten Server in the 1.x series. Precompiled Windows binaries are provided for the convenience of Windows users. Users of other operating systems are advised to build the source code on their system by following our compiling instructions: https://github.com/otland/forgottenserver/wiki/Compiling
For more information, see the release announcement on OTLand: https://otland.net/threads/the-forgotten-server-1-2.246641/
This is the second stable release of The Forgotten Server in the 1.x series. Precompiled Windows binaries are provided for the convenience of Windows users. Users of other operating systems are advised to build the source code on their system by following our compiling instructions: https://github.com/otland/forgottenserver/wiki/Compiling
For more information, see the release announcement on OTLand: https://otland.net/threads/the-forgotten-server-1-1.232064/
This is the first stable release of The Forgotten Server in the 1.x series. Precompiled Windows binaries are provided for the convenience of Windows users. Users of other operating systems are advised to build the source code on their system by following our compiling instructions: https://github.com/otland/forgottenserver/wiki/Compiling
For more information, see the release announcement on OTLand: http://otland.net/threads/the-forgotten-server-1-0.223775/