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

Source's custom OT game engine (TypeScriptFTW)

Very nice!

Reading your change list, just come to my mind the questions, considering that it is a brand-new project
are you using any unit/integration tests on this project?
are you following any architecture guidelines, such as clean architecture or similar?

Keep working, it looks very promising!
You'd have to define those things for me as I'm not familiar with them, at least as words/concepts.
I would wikipedia them if I wasn't so lazy.

I'm doing my best to keep the design clean.
But it's a work in progress. It's messier than TFS for sure, the simpler/minimalistic design that keeps RAM usage low (less than 1/3rd of TFS memory usage for map) makes it perhaps more difficult to get into, and core functions is a work in progress, there are also limitations by the language that makes it so that not everything can be moved into C++ etc.

For example TFS is very object-oriented, there's a function to check every single detail of every single object, but at a big memory and complexity cost, I don't use any such design, my design is minimalism, so you call world.getTile(pos) and now you've got a simple pointer to a worldtile struct, not a C++ class object with 200 different methods.
Here's the struct definition of worldtile:
Code:
struct worldtile {
  unsigned char elements; // POISON, FIRE, ENERGY
  unsigned char flags; // PZ, REFRESH, NOLOGOUT, AVOID, UNPASS, UNTHROW
  unsigned char groundsCount;
  unsigned short itemsCount;
  unsigned short tilespeed;
  unsigned short blockCount;
  unsigned short avoidCount;
  std::vector<worlditem> items;
  worldtile() {blockCount=0, unsigned int avoidCount=0) {
    this->elements = this->flags = this->groundsCount = this->itemsCount = this->tilespeed = this->blockCount = this->avoidCount = 0;
  }
};

I also don't rely on any 3rd party frameworks or libraries, such as Boost.
Everything is hand-written. This means less dependencies, ergo no dependency-hell, and quality assurance in my case since I'm pretty decent at what I'm doing.

For example for my OTClient project I needed a AES-CTR encryption library for Python, the developers of the best library had tens of thousands of lines of code and they couldn't do the job right, it had serious issues with the design, I git cloned a tiny AES-CTR codebase and wrapped it with less than 100 lines of Python to create my own library instead, this way I got a functioning module that I don't have to worry about having functions or parameters replaced/renamed etc in the future, this was a much better solution for me.
When you can't trust other people doing the job, you've gotta do it yourself, that's my motto and what drove me to create "TSSFTW" or CO4 as I call it internally.

The design isn't perfect, but it has no 3rd party dependencies, can be compiled both for Linux and Windows, uses less than 1/3rd of the RAM compared to TFS, has the same or better CPU performance in most areas, and the codebase is less than 1/10th of TFS' size.
These are the advantages in my opinion - I prefer having a small, slightly messy codebase, than 10x the amount of code and high complexity for every single function.
With my server there's no abstractions, so you have to learn how the server (or really any Open Tibia server) is built internally to be able to develop it properly.
Advantage: Simplicity, programmers learn more about how the thing is actually made internally, with less code to read, and less complexity.
Disadvantage: Not well-suited for newbies or people who are not eager to learn, who prefer toys and interfaces (e.g. OOP) to real tools.

Here's my real motto :)
 
Early update:

Since last week I've implemented neural networks for my server that detects cheating such as basic macros, autofishing and will eventually be trained to detect fastfishing once I've found a proper programmatic macro library for Linux that I can script a sufficiently advanced fastfishing in for training purposes.

This latest neural network version uses mousePos + mouseButton data from the client sent to the server automatically when extended opcodes is enabled and nothing else. This is crucial to be able to detect fastfishing with a human or human-proximate delay.

Here's a demo of the network detecting cheating

I'm going live soon after this post is published for anyone curious about how it works or how it's implemented at
and https://www.youtube.com/@sourcechan
 
this looks very good m8... keep it up! proud to see someone in the community going for something like this! love to see more.
 
Just a heads up: I'm still alive, still working on the project.
Been a month since the last update, but been busy with moving IRL and working on trying to perfect the neural network.
I got the neural net to do everything... except for the very last thing - detecting fastfishing - and I might have to scrap all the data I've generated so far to get it to work, so I've stopped working on the neural net for the time being.
After all it was only a demonstration of what my server architecture is capable of, but hopefully I'll be able to implement anti-cheat later on.

A few updates:
  • Fixed handleItemsExpire handling items in containers and inventory slots
  • Login Server character name derived from players_saved
  • Added neural network to the server (demo) and CSV logging -> upgraded demo neural net to mousePos net
  • Added client-based mousePos + mouseButton if OS == 10 (extended opcoded)
  • Added neuralNet parameters to config.py
  • Added playerLoadTimeThreshold to config.py
  • Fixed poison spells previously causing direct magic damage instead of poison damage
  • Fixed creatures without KickBoxes flag not stepping on fields they're immune to
  • Started parsing moveuse.dat and generated all the basics of all the MoveUse "functions" (cppclasses) in gen/

So the main news is I've started to work on parsing MoveUse.dat since yesterday. So far I've got all the functions broken down into function names and arguments with the parsing, and generated all the classes using Python to store the MoveUse rules later on during parsing of the file.

Keep in mind getting everything to work with MoveUse is probably going to take months if not years, all I'm hoping for is some basics for now, like moving up and down ladders and holes, maybe within the end of the year? :)

I won't be available on my desktop computer for about 2 weeks very soon (only my laptop), so no more updates for October, if everything goes smooth and I get my desktop up working again after 2 weeks you can expect more updates in November.

Here's how the semi-parsed MoveUse.dat looks like for now:
GT9BiKW.png


Have a good weekend everyone <3
 
Finishing parsing MoveUse.dat yesterday night.
Hq7adew.png


Parsing was easier than expected.
Not only that, making just stairs (IsType -> MoveTopRel) work was also sort of easier than expected:

So I guess making stairs work was fixed sooner than by the end of the year... even though we are technically pretty close to the end of 2023 :)
Lets mix it up a little bit: Maybe we'll get most if not all of MoveUse working by the end of the year. That would be cool.

Keep in mind fixing stairs was kind of done with a hack, it doesn't actually move the top item, it always moves the last player x)
But shouldn't take too much effort to make it move the top object. Making these ~50 pseudo-functions work though will take quite a lot of effort, so wish me luck!

Cheers! 😎
 
This source is very interesting. On that basis, what is it based on? TFS? OTX? Is it already available to download so I can test it? What is the version? Is it available for 7.92?
 
I've been working a little over a year or so on my own game engine from scratch written mainly in C/C++ possibly with some non-Lua scripting in there.
Thought I'd share a few random videos here for fun from 2021 before the year ends.
It runs natively on Windows, Linux, and probably MacOS as well without the need for MSVS or any other overly complicated or bloated setups, and uses objects.srv (ascii items attributes) instead of items.otb, monster.db (real tibia monster spawn file), sector map files (ascii real tibia map files format), etc, so there's no use of any binary data formats at all.
And it also has multicore support for map loading as you can see in the first video demo.

A short demo of running it on Windows (please excuse my mouse movement, I was on a laptop):

A for-fun aimpractice module I created in about an hour or so of time on server side:

Some recent work where I implemented a config.lua-like config with C speed access times and alteration of push stackpos behavior:

A long and boring video of progress on perfecting real tibia monster idle movement and spawning algorithm:

My patreon: Patreon
is your project done ? Wanna See it
 
I am loving the progress of this.
But I have a question; why did you choose TypeScript and not C# for example?
 
based on the few posts I've read in this thread, you are using a game loop that mimics Cip's async event queue?
 
I've now finished moving and have setup my desktop PC again.
I have been working a little on my laptop in the meanwhile though.

We reached commit 100 last week!
Keep in mind one commit for me is not one bug fix, but an average of 5 significant bug fixes.
So the number of bug fixes, just on git, is about 500.
Since commit 100 however I have decided to start doing 1 and 1 bug fix instead as it can be more efficient in certain circumstances.

Highlight fixes since last update:
  • Players, creatures and items can be thrown or walk up/down stairs, holes, or use ladders.
  • Roping works (had to fix a bunch of stuff to get it to work) using the Retrieve MoveUse function
  • Light from light items in EQ

Full git changes since last update:
  • Roping creatures now in right order
  • Fixed bug in creature:move so now roping works without segfault or networkBufferError
  • Seemingly fixed getTopObject
  • player.loadInventory(init=True) and onPush: item2 = world2.getObject(..., stackpos=0, ...) + print monster light items and their position
  • Improved/unbugged world.getObject(...)
  • Added ChangeUse code to Use + replace item in inventory
  • Sets light intensity and color when lightsource in inventor
  • Use and Multiuse
  • Player speed is now only updated upon exp when leveling up AND new speed is greater than current speed
  • Walkblock mediated by tryAgain setting walkdir -> finishedWalking calls walk if walkdir
  • Creatures has full def when not targeting anyone
  • Exhaust/cost fixed so players can still walk when cost >= 1k
  • Added holes moveuse functionality for players and items
  • Fixed shielding should only increase when there's a shield in the equipment
  • Mostly fixed skills being bugged for generic GM characters
  • Added walkblock

Here's a couple GIFs:
- Light from creature with light object in EQ (might not be accurate to Real Tibia, I haven't tested, but it's a fun little feature for now and also applies to players)
- Roping creatures and an item from a hole using the Real Tibia Retrieve MoveUse function

I am loving the progress of this.
But I have a question; why did you choose TypeScript and not C# for example?
Thank you :)
It's not actually built with TypeScript, which is a meme name I came up for the server before I decided to share what language I actually use, it is mainly written in C++. The particular language I use can be found on my youtube channel, I don't want to publicize it more than is necessary since this forum is kind of... blackhat and corny.
Feel free to message me on discord about it if you don't want or aren't able to lookup my youtube channel and I'll let you know there.

based on the few posts I've read in this thread, you are using a game loop that mimics Cip's async event queue?
Yeah, kind of. I have a main loop that runs asynchronously on a timer, and also individual events to various other functions that runs one time per event asynchronously.
There's also other timed asynchronous events such as monster main loop and NPC main loop which are timed but not scheduled to run at the same time since each individual monster may be activated at different times, so I guess they're not main loops at all but creature behavior loops.

is your project done ? Wanna See it
It's pretty far from being done still. I might host a testserver for looking for unknown bugs and stuff later on, maybe by the end of the year.

This source is very interesting. On that basis, what is it based on? TFS? OTX? Is it already available to download so I can test it? What is the version? Is it available for 7.92?
It's written from scratch. It's not OTServ based. It supports client versions 7.4, 7.6, 7.7 and 7.72, but your client will crash if it doesn't use 7.7 SPR and DAT.
It's real tibia files, so the only real client version that's supported is 7.7 due to the objects.srv file structure (equivalent to items.otb) which there only exists one version of, namely for v7.7.
However slightly newer versions can be made by hand pretty easily by just extending and manipulating objects.srv in a plain text editor up to say version 8.0 or beyond.
But you'd also have to edit moveuse.dat for any tiles or items that should be scripted and map places like Svargrond and Liberty Bay yourself.
 
I've waited about 8 months to post my 100 msg, and Im sure I want to dedicate it to this legend. Im sorry for ruining our friendship @Source youre an absolue legend, and Im just about too stupid to understand this article to its full potential but from what I understand I think your stuff looks amazing and I do wish you the best my friend. Much love from Sweden. Hope youre doing fine bro <3
 
Time for another update:

Major changes:
  • Bunch of minor to medium bug fixes
  • Reduced pathfinding cost by 96.5% or improved performance by 2800% depending on how you look at it when it comes to screens full of monsters

Improved pathfinding performance by 2800%:
YiW0qWV.png


Full changelogs:
  • Simplified MoveTopRel
  • Fixed world.getItem() getting the wrong item (and also segfaulting if item does not exist)
  • Improved world.replaceItem()
  • Fixed world2.setItem() expiration times
  • Autowalk fixed
  • Added no except to nogil functions
  • Fixed pools shouldn't be added to special (Avoid Bank) tiles
  • Fixed forceuse parameter for world2.getObject() and rope (MoveRel)
  • Fixed world.getTopItem()
  • Added world.getTopStackpos(...)
  • Fixed MoveRel
  • Added Change moveuse and fixed getObjectStackpos
  • Cyitp = &world.cyitems[itemid] -> World.getCyitem(...) + numberIs renamed to letterInString
  • Reduced pathfinding cost for distance creatures
  • Fixed creatures being removed when they die
  • /rotate crashes client, think it's related to monsters not turning into corpses maybe
  • Fixed castviewer creature is not removed at death
  • Fixed creature invisibility issues (castviewing, attacking when has SEEINVISIBLE flag, turn when castviewing, etc)
  • Improved pathfinding performance by 2800%

CPU% usage was up to 20% before with a screen full of orc spearmen (after an update where monsters changes target under various conditions), up to 10% for a screen full of orcs, the usage is now 2-2.7% with a screen full of orc spearmen, 2.7-5% with screen full of orcs, 0.7-1.3% usage by default with no players on.
You might be telling yourself "that's not a 2800% performance improvement", yeah, there's still other things that needs to be optimized, but pathfinding seem no longer be a performance issue and it's pathfinding specifically that was improved.
The most expensive operation related to movement (e.g. orcs randomly moving around when it has no target) now is the MoveUse system which might be hard to optimize much, but we'll see.
 
Time for another update:

Major changes:
  • Bunch of minor to medium bug fixes
  • Reduced pathfinding cost by 96.5% or improved performance by 2800% depending on how you look at it when it comes to screens full of monsters

Improved pathfinding performance by 2800%:
YiW0qWV.png


Full changelogs:
  • Simplified MoveTopRel
  • Fixed world.getItem() getting the wrong item (and also segfaulting if item does not exist)
  • Improved world.replaceItem()
  • Fixed world2.setItem() expiration times
  • Autowalk fixed
  • Added no except to nogil functions
  • Fixed pools shouldn't be added to special (Avoid Bank) tiles
  • Fixed forceuse parameter for world2.getObject() and rope (MoveRel)
  • Fixed world.getTopItem()
  • Added world.getTopStackpos(...)
  • Fixed MoveRel
  • Added Change moveuse and fixed getObjectStackpos
  • Cyitp = &world.cyitems[itemid] -> World.getCyitem(...) + numberIs renamed to letterInString
  • Reduced pathfinding cost for distance creatures
  • Fixed creatures being removed when they die
  • /rotate crashes client, think it's related to monsters not turning into corpses maybe
  • Fixed castviewer creature is not removed at death
  • Fixed creature invisibility issues (castviewing, attacking when has SEEINVISIBLE flag, turn when castviewing, etc)
  • Improved pathfinding performance by 2800%

CPU% usage was up to 20% before with a screen full of orc spearmen (after an update where monsters changes target under various conditions), up to 10% for a screen full of orcs, the usage is now 2-2.7% with a screen full of orc spearmen, 2.7-5% with screen full of orcs, 0.7-1.3% usage by default with no players on.
You might be telling yourself "that's not a 2800% performance improvement", yeah, there's still other things that needs to be optimized, but pathfinding seem no longer be a performance issue and it's pathfinding specifically that was improved.
The most expensive operation related to movement (e.g. orcs randomly moving around when it has no target) now is the MoveUse system which might be hard to optimize much, but we'll see.
This is going really fast 💪💪
 
Time for another update:

Major changes:
  • Bunch of minor to medium bug fixes
  • Reduced pathfinding cost by 96.5% or improved performance by 2800% depending on how you look at it when it comes to screens full of monsters

Improved pathfinding performance by 2800%:
YiW0qWV.png


Full changelogs:
  • Simplified MoveTopRel
  • Fixed world.getItem() getting the wrong item (and also segfaulting if item does not exist)
  • Improved world.replaceItem()
  • Fixed world2.setItem() expiration times
  • Autowalk fixed
  • Added no except to nogil functions
  • Fixed pools shouldn't be added to special (Avoid Bank) tiles
  • Fixed forceuse parameter for world2.getObject() and rope (MoveRel)
  • Fixed world.getTopItem()
  • Added world.getTopStackpos(...)
  • Fixed MoveRel
  • Added Change moveuse and fixed getObjectStackpos
  • Cyitp = &world.cyitems[itemid] -> World.getCyitem(...) + numberIs renamed to letterInString
  • Reduced pathfinding cost for distance creatures
  • Fixed creatures being removed when they die
  • /rotate crashes client, think it's related to monsters not turning into corpses maybe
  • Fixed castviewer creature is not removed at death
  • Fixed creature invisibility issues (castviewing, attacking when has SEEINVISIBLE flag, turn when castviewing, etc)
  • Improved pathfinding performance by 2800%

CPU% usage was up to 20% before with a screen full of orc spearmen (after an update where monsters changes target under various conditions), up to 10% for a screen full of orcs, the usage is now 2-2.7% with a screen full of orc spearmen, 2.7-5% with screen full of orcs, 0.7-1.3% usage by default with no players on.
You might be telling yourself "that's not a 2800% performance improvement", yeah, there's still other things that needs to be optimized, but pathfinding seem no longer be a performance issue and it's pathfinding specifically that was improved.
The most expensive operation related to movement (e.g. orcs randomly moving around when it has no target) now is the MoveUse system which might be hard to optimize much, but we'll see.
I really admire your competetivness, your stuff will be main thing sooner then later brotha!!!!!!!!
Woho for modern-day coding
 
Good news everyone!

  • More than half of the MoveUse system has been implemented. This includes: Fishing (no worms for now), Bread Making, Shoveling, Picking, Stairs, Holes, Ladders, Throwing items in water/lava/dustbins, stepping on Fields taking damage, and much more. Fishing uses Fishing skill, picking special rocks uses Axe skill, both using the Real Tibia formula (Thanks to @Ezzz & Michael).
  • Hugely boosted performance of MoveUse iteration (switched from a Vector<...> to a Map<unsigned short, Vector<...>>)
  • onLook now has non-GM mode for looking at single objects (creatures, items, self)
  • Loads of bug fixes

Some screenshots:
op8BFqX.png

3WeS4C6.png

TXhj8DP.png

awSEdQm.png

GTtZVFM.png

E2tCs8f.png

C3D2zaJ.png

vOCtm7P.png


Full changelogs:
  • Replaced all IF with if statements (deprecation)
  • Fixed bug in world2.moveItem (bad return)
  • setItem cumulative bug
  • Merge items in MoveUse Create
  • Replace Position& with Position
  • Rename declarations.h to declarations.hpp
  • Look at single item in non-GM mode including creatures and Cumulative/Liquid items, Containers, Text, Weight
  • Replaced all x,y,z with Positions
  • Started replacing ...* blah with ... *blah
  • world2.setItem sets secondary if item is cumulative
  • onUse Liquid Containers + MoveUse HasInstanceAttribute and SetAttribute
  • Added MoveTop, MoveTopOnMap, IsObjectThere, IsPlayerThere, IsPosition, DeleteTopOnMap
  • Fixed DeleteOnMap and Delete
  • Fixed NPCs no longer talking to us
  • Fixed "It was an honor to serve you %N"
  • Seemingly fixed world.getTopStackpos and world2.getObject
  • Fixed Damage and TestSkill, added IsPosition and DeleteOnMap
  • Fixed void damage() ignoring shield and armor when no actor
  • Fixed a segfault sometimes when teleporting on empty tiles
  • Added Cr to MoveUse Event
  • Added Reverse flag to every MoveUse condition
  • Monsters now walks again when on a different floor with a config value
  • Added Delete, HasFlag, CountObjectsOnMap, CountObjects, and fixed Reverse for HasFlag
  • "Change" bug (actually gameSendUpdateTileObject which, among other functions, does not check Disguise value)
  • Paralyze bomb affects GM
  • Outfit spells no longer work (e.g. Halloween hare)
  • Fixed segfault in spells "if tile and ... -> continue" (spell/fields on empty tiles = crash)
  • No more fire on stairs
  • Reduced loop calls by adding a small sleepOffset so it doesn't retry 10x times before passing through
  • Added Random, Effect, EffectOnMap, Monster, Create, Damage, IsPlayer, IsCreature (Change sometimes bugs on client side)
  • Changed MoveUse rule execution to only 1 rule successful -> break, not sure if this is right, but think it is
  • Collision happens immediately on real tibia -> now happens on this server as well
  • Implemented TypeId indexing of MoveUse scripts (perf boost)
  • Fixed bug + double segfault in changeTarget() damage strat, segfault when damage is by dead monster e.g. fire and 2nd segfault in lack of parantheses in conditions
  • Commented out unused pathfinding functions

Thanks for the support / positive comments guys. Hope you're all doing well.
 
Merry Christmas everyone, and a happy upcoming new year.

We didn't manage to complete the MoveUse system within Christmas, but we did get over halfway there :)

Here's some of the things we fixed since the last update:
  • Completed all onLook features and bugs except for containers total weight (we now see equipment charges, vocation requirements, atk/def, throwatk/def, equipment remaining time, equipment level requirements, etc) and encoded plural name rules (such as blueberry -> blueberries) based on English grammar rules (not on a per-item basis).
  • Quest "chests" (including quests like doublet quest)
  • Merging items on floor
  • Fixed Separation
  • Other bug fixes

Here's parchment quest sort of working (bug in creatures not activating when THEY are moved).
Depot tiles
Rookgaard bridge
Rookgaard destroy wall lever

And much more, like premium bridge, level 2 bridge, teleports, bug/wolf/troll/spider arena levers, etc.

Full changelogs:
  • ThrowAttack and ThrowDefense
  • Encoded all plural name rules to onLook
  • Says "1 minute", not "minutes", " left"
  • No multiplied weight for LiquidContainers
  • No reading text of non-takable objects
  • Only show weight when nearby item
  • Look at inventory items and see their 'descriptions' (e.g. skull staff 'This staff longs for death.')
  • Fixed itemsCount not always being incremented in world2.loadMapFiles() leading to items being unlookable and unmovable
  • Quest chests + cppplayer:addToInventory(...)
  • world.purifyItem(...) sets uid, secondary and usesecondary if appropriate
  • Merging Cumulative items up to count 100 on tile in world.addItem(...)
  • Added gameSendAddObject/gameSendUpdateObject to world.addPyItem
  • We check if Cumulative and count > 1 in world.moveItem and respectively call gameSendUpdateTile if true
  • Renamed world.purifyItem to world.initItem
  • Added Position world.getPosReverse()
  • Bunch of medium large changes in world2
  • Segfault when map clicking other side of rook bridge
  • Fixed clicking blueberries shows client sided 2 stacks of blueberries with 2 + 3 berries
  • gameSendAddObject now uses worlditem not Py list
  • gameSendTurn now uses Position
  • "Fixed" creatures not being removed upon death (needs to be simplified in the future)
  • "The a loose board is empty"
  • Added ChangeOnMap + set tilespeed in world2.setItem() -> rook lever now works
  • Fixed DeleteOnMap
  • Slightly fixed world2.moveItem()
  • Added Position.split() -> vector[unsigned short] to convert Position to x,y,z
  • Removed old getPosReverse(...)
  • Improved world2.spawnMonster(...) - cleanup and fixed monsters never spawning on initial square
  • Separation
  • Fixed world.getObjectStackpos
  • Fixed world2.setItem and world2.replaceItem success condition
  • HasLevel
  • Fixed separation properly this time (world2.getObject should get bottom item, not tile.groundsCount - 1)

Cheers everyone, have a good celebration :)
 
Happy new years everyone :)

Boring update today:
  • Lots of bug fixes (including demons not being activated when moved to player)
  • Improved monster "aggression" when they're attacking through elemental fields for them to walk through them when attacked
  • Internal changes/improvements including the functions:
  • Creature:getStat()
  • Creature:setStat() with all fields being set, this way we can easily get skill levels, percentiles, level, experience, health, mana, etc
  • Creature:getCondition() and we have improved world.cpp to be split into world.cpp and world.h which now means we can and have added a few methods to the worlditem struct! This change was a change to over 500 lines of code. The methods are:
  • worlditem::data() which turns the worlditem into a std::vector with all the fields, this is for backwards compatibility with printing worlditem structs, so we now print(item.data()) instead of print(item) since structs/classes with methods cannot be printed directly
  • worlditem::setAttribute(const std::string& key, const std::string& value)
  • worlditem::isValidAttribute(const std::string& key) for checking if attribute is valid when setting it.

Nothing else new, nothing interesting, just a lot of bug fixes and internal changes.

Full changelogs:
  • Fixed segfault in world2.getObject stackpos == 0xFF and no tile.items
  • Fixed bloodbug (double gameSendAddObject and gameSendRemoveObject)
  • Fixed bug "in parchment quest" (demons being moved does not activate)
  • Bug (client crash) when multiple field runes is thrown onto player
  • Fixed right clicking items in inventory no longer works
  • handleItemsExpire -> delete 0xFFFF items when itemid is
  • handleItemsExpire() -> replace items.items and world.cyitems[item.itemid] with cyit
  • Removed old poof and hit effects when walking on elements
  • Bunch of bug fixes and trying to fix monsters aggression behavior
  • Fixed summons changeTarget when they're pushed bug
  • findPath classicMode fixed/added
  • Summons movement seems fixed
  • Aggressive mode seems decent
  • Fixed players can't walk onto Avoid+Unmove tiles
  • Added rule that if player has PZ they can't walk into PZ
  • Creature:getCondition()
  • Creature:setCondition changed p1 from unsigned char to ConditionInternal
  • Creature:getStat()
  • Creature:setStat()
  • Replaced world.cpp with world.h + world.cpp and added first function to worlditem (worlditem::data())
  • Added conditionType == PARALYZE to "isGM() -> return" in Creature::setCondition
  • gameSendCreatureHealth now uses cr.getStat(STAT_HEALTH) etc instead of cr.health :D

I also made my own little song yesterday that I liked. Played this in the back while digging for scarabs on my server (monsters currently have bugged health due to transitioning from cr.health etc to cr.getStat(STAT_HEALTH), this is why they die instantly from a single attack even if it misses rn):
 
Update since the 13th of Jan:

Server updates:
* Fixed some bugs (7 bugs).

Full git changelogs:
  • Replaced .health with .getStat(STAT_HEALTH) and .setStat(STAT_HEALTH, value)
  • Fixed bug with creatures not dying at 0 health
  • Fixed bug with thousands of players not being loaded due to 0 health
  • Added tile loops for checkMoveUse to loop through all items when checking for MoveUse Events
  • Fixed monsters healing causes damage to themselves
  • Items being added to inventory prioritizes inventory > containers in inventory
  • Capacity doesn't change to capacitymax when regenerating health

Client updates:
  • Massive improvements to the 3D sound system; moving sounds (missiles), sounds attached to item objects so they can be moved around, and sound from items in inventory, all of these had their own challenges.
  • Added a bunch of sounds

Full git changelogs
  • Added serpent spawn, orc1234 and arrow to /sounds
  • Added support for moving sounds, such as missiles
  • Improved delay formula for playFileMove
  • Added connections between SoundSources and Things such that moveable objects can now make sounds too!
  • Play inventory sounds without position (without 3D)
  • Stop all audio on death and on logout
  • Also don't play creature sounds after death until relog
  • Improved sound levels of various audio files
  • Improved lastPlayed system in g_custom when playing sound files
  • Moved a couple of audio files to effects where they belong

Other:
* Also wrote a mobile app in Python that lets me run code (similar to all of these "online code compilers", except can be used offline on your mobile) in Python on my mobile. Supports error handling (showing errors/stacktraces in console), supports defining functions, executing functions, inspecting modules, using modules, etc, includes all standard Python3 modules + numpy and lets you even manipulate the app itself if you want.

Full git changelogs:
  • Init: App with 4 screens, currently only 1 used, swiping activated, numpy and PIL included
  • All screens can be swiped and screen (nr) is actually updated when screen is changed
  • Two screens being used
  • Figured out how to do Layouts the right way
  • Eval + Exec subapp on Screen 2
  • text_size wrapping for Label at Screen #2
  • inspect() function
  • fps and event monitor activated
  • screen switching directions
  • better code abstraction for screens
  • redirect stdout to Label on Screen #2 when doing exec(...)
  • relative sizes implemented at Screen #2
  • ScrollView implemented with automatic scrolling down to Label2 widget on submit
  • forgot to mention both orientations enabled in previous commit
  • reimplemented FPS counter manually because the built-in monitor's position is broken on Android

Updated client sound system demo with some royalty-free demo sounds:
 
Back
Top