So i got downvoted because i dident provide you with a readable answer?
What “storage” is in TFS (conceptually)
A
storage is basically:
Think of it like a tiny database row attached to each character.
- Key = a number (storage ID)
- Value = a number (usually -1, 0, 1, 2, etc.)
Example:
<span><span>Storage 5000 = 1<br></span></span>
Means:
this player has progressed something
Default behavior (IMPORTANT)
If a storage was
never set:
<span><span>player:getStorageValue(</span><span><span>5000</span></span><span>) == </span><span><span>-1</span></span><span><br></span></span>
So:
- -1 = not started / never touched
- 0+ = something has been set
This is why you’ll see == -1 checks everywhere.
Creating a storage (there is no “registration”)
You
do not create storages anywhere.
There is:
no database table
no XML
no config file
You just
pick a number and use it.
Best practice: reserve ranges
Common convention:
<span><span>1000–1999 = small quests<br>2000–2999 = main quests<br>3000–3999 = NPC states<br>50000+ = systems / global logic<br></span></span>
Example:
<span><span><span>local</span></span><span> STORAGE_MAIN_QUEST = </span><span><span>2000</span></span><span><br></span></span>
Reading a storage
<span><span><span>local</span></span><span> value = player:getStorageValue(</span><span><span>2000</span></span><span>)<br></span></span>
Typical checks:
<span><span><span>if</span></span><span> player:getStorageValue(</span><span><span>2000</span></span><span>) == </span><span><span>-1</span></span><span> </span><span><span>then</span></span><span><br> </span><span><span>-- player has NOT started</span></span><span><br></span><span><span>end</span></span><span><br><br></span><span><span>if</span></span><span> player:getStorageValue(</span><span><span>2000</span></span><span>) >= </span><span><span>1</span></span><span> </span><span><span>then</span></span><span><br> </span><span><span>-- player is in progress or finished</span></span><span><br></span><span><span>end</span></span><span><br></span></span>
Saving / setting a storage
This is where it’s “saved”.
<span><span>player:setStorageValue(</span><span><span>2000</span></span><span>, </span><span><span>1</span></span><span>)<br></span></span>
That’s it.
TFS automatically:
- stores it in the database
- loads it when the player logs in
- keeps it per character
You
do not manually save anything.
Typical quest progression example
<span><span><span>local</span></span><span> STORAGE_QUEST = </span><span><span>2000</span></span><span><br><br></span><span><span>if</span></span><span> player:getStorageValue(STORAGE_QUEST) == </span><span><span>-1</span></span><span> </span><span><span>then</span></span><span><br> player:sendTextMessage(MESSAGE_INFO_DESCR, </span><span><span>"Quest started!"</span></span><span>)<br> player:setStorageValue(STORAGE_QUEST, </span><span><span>1</span></span><span>)<br></span><span><span>elseif</span></span><span> player:getStorageValue(STORAGE_QUEST) == </span><span><span>1</span></span><span> </span><span><span>then</span></span><span><br> player:sendTextMessage(MESSAGE_INFO_DESCR, </span><span><span>"Quest completed!"</span></span><span>)<br> player:setStorageValue(STORAGE_QUEST, </span><span><span>2</span></span><span>)<br></span><span><span>end</span></span><span><br></span></span>
Progression:
<span><span>-1 = not started<br> 1 = started<br> 2 = completed<br></span></span>
Using storages with NPCs
Very common pattern:
<span><span><span>if</span></span><span> player:getStorageValue(</span><span><span>3001</span></span><span>) < </span><span><span>1</span></span><span> </span><span><span>then</span></span><span><br> npcHandler:say(</span><span><span>"Hello stranger."</span></span><span>, cid)<br></span><span><span>else</span></span><span><br> npcHandler:say(</span><span><span>"Welcome back, hero."</span></span><span>, cid)<br></span><span><span>end</span></span><span><br></span></span>
And when the player accepts something:
<span><span>player:setStorageValue(</span><span><span>3001</span></span><span>, </span><span><span>1</span></span><span>)<br></span></span>
Using storages with actions / movement scripts
Action example (lever, chest, etc.)
<span><span><span><span>function</span></span></span><span> </span><span><span>onUse</span></span><span><span>(player, item, fromPosition, target, toPosition, isHotkey)</span></span><span><br> </span><span><span>if</span></span><span> player:getStorageValue(</span><span><span>4000</span></span><span>) == </span><span><span>-1</span></span><span> </span><span><span>then</span></span><span><br> player:addItem(</span><span><span>2160</span></span><span>, </span><span><span>10</span></span><span>)<br> player:setStorageValue(</span><span><span>4000</span></span><span>, </span><span><span>1</span></span><span>)<br> player:sendTextMessage(MESSAGE_INFO_DESCR, </span><span><span>"You found a reward."</span></span><span>)<br> </span><span><span>else</span></span><span><br> player:sendTextMessage(MESSAGE_INFO_DESCR, </span><span><span>"The chest is empty."</span></span><span>)<br> </span><span><span>end</span></span><span><br> </span><span><span>return</span></span><span> </span><span><span>true</span></span><span><br></span><span><span>end</span></span><span><br></span></span>
Common mistakes (VERY important)
Using storage
Storage 0 is risky and sometimes reserved.
Avoid it.
Reusing the same storage for multiple things
<span><span><span>-- BAD</span></span><span><br>STORAGE = </span><span><span>2000</span></span><span><br></span></span>
Use separate IDs:
<span><span>STORAGE_QUEST = </span><span><span>2000</span></span><span><br>STORAGE_BOSS = </span><span><span>2001</span></span><span><br>STORAGE_DOOR = </span><span><span>2002</span></span><span><br></span></span>
Forgetting that default is
Checking:
<span><span><span>if</span></span><span> player:getStorageValue(id) == </span><span><span>0</span></span><span> </span><span><span>then</span></span><span><br></span></span>
…will
fail if it was never set.
GlobalStorage (difference)
- Storage → per player
- GlobalStorage → shared by the entire server
<span><span>Game.getStorageValue(</span><span><span>9000</span></span><span>)<br>Game.setStorageValue(</span><span><span>9000</span></span><span>, </span><span><span>1</span></span><span>)<br></span></span>
Use GlobalStorage for:
- world events
- raid states
- server-wide quest phases
Debugging storages
Quick debug:
<span><span>player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE,<br> </span><span><span>"Storage 2000 = "</span></span><span> .. player:getStorageValue(</span><span><span>2000</span></span><span>))<br></span></span>
TL;DR
- Storage = per-player key/value
- Default value = -1
- No registration needed
- Saved automatically
- Use ranges + constants
- setStorageValue() = saving
If you want next, I can:
- show real Tibia quest patterns
- design a storage map for a big questline
- explain storage vs globalstorage pitfalls
- show how TFS 1.4+ differs
Just tell me