Content and general development discussion, including quest scripts and server code. TMW Classic is a project comprising the Legacy tmwAthena server & the designated improved engine server based on evolHercules.
Forum rules
This forum houses many years of development, tracing back to some of the earliest posts that exist on the board.
Its current use is for the continued development of the server and game it has always served: TMW Classic.
Replace lots of ad-hoc, manually-managed, data types.
Remove support for server-side ignore lists.
Add configure script so that build settings can be persisted.
Drop support for building with gcc before 4.6
Update license from GPL2+ to GPL3+
Replace outdated readme with a pointer to the wiki.
Support native amd64 builds instead of just x86. Basic support for the x32 ABI (not actively maintained).
Change logs to give map name instead of map number, and be better with the reason for XP gains.
Turn on a lot more compiler warnings. Change the code to cut down on them, and suppress a few instances.
Add a cxxstdio system to cut down the number of manual casts.
Use custom string classes for better performance and safety. Implement lots of utility methods using them, and replaces all uses of plain char arrays. (there are still uint8_t arrays in the network code)
Remove the cached character index, it was way too hard to keep updated and the performance hit is relatively small anyway. Future refactorings (possibly including a database backend) will negate the penalty.
Reimplement the logging system in terms of cxxstdio.
Replace a lot of indices with pointers, for things that aren't persistent.
Reimplement savefiles in terms of cxxstdio, fixing problems related to buffer overflows.
Add a typesafe, template-based recursive extractor system.
Reimplement savefile reading in terms of extractors, fixing problems related to buffer overflows.
Handle maps consistently (ignore everything after the .). This changes the savefile format.
Fix a bug with character memo points (not used by TMW).
Fix a buffer overflow related to skill IDs that are not used by TMW content, but could still be enabled by GM commands.
Replace most uses of fgets with std::getline.
Change some error and log messages to reduce the amount of silly code.
Remove support for merging and saving backup files, it was a bad idea.
Make validation of new characters a little less stupid.
Remove support for job classes.
Remove a lot of options related to the online list generation. Change the time to be in UTC (TODO update the PHP page once this gets pushed).
Use strict enum classes instead of magic numbers in most places. Fix lots of bugs exposed by this.
Send the job level again (it is used for skills now).
Remove support for native guilds (which were not used and were subject to subtle and nasty bugs and resource problems).
Fix some bugs in the network layer related to banned players.
Remove support for kamib, it didn't work anyway and had a *really* stupid implementation.
Fix a bug related to itemfrob and weapons.
Make timers sane. Fix bugs exposed by this.
Add basic helpful utility functions to the network layer. Fix bugs related to this.
Make conditional callsub/callfunc an error, to avoid buffer overflows.
Make character names case-insensitive, after verifying that the current setup does not cause problems.
Make account names case-sensitive, after noticing that the current setup already causes problems.
Unify parsing of ban/expiration timediffs
Make script variables case-sensitive everywhere instead of only some places. Fix scripts; verify that current savefiles are not a problem.
Remove some substring searches that expected only a single result (Recent ManaPlus do tab completion based on the online list).
@spawn/@summon, as a side effect of enforcing this in scripts.
@item is now case-sensitive, as a side effect of enforcing this in scripts.
Refactor away negative jumps in the network.
Fix a nasty bug where characters could be accidentally deleted in a fallthrough.
Remove option to overload of the "delete" packet for email address creation.
Send the actual version number. Set a versioning scheme based on the date.
Remove support for encrypting the ladmin password; it never left localhost anyway and led to quite a bit of ugly code.
Add lots of warnings when reading config files.
Update some hardcoded defaults.
Changed the parsing of command-line arguments (not used with the current setup).
Make (millisecond) ticks 64-bit, avoiding subtle problems that occur every 49 days.
Allow specifying durations in other units, such as seconds and minutes, in a reliable way.
Remove a lot of unused return types.
Poison the edge of several headers.
Fix a bug related to dropped whispers.
Replace some buffer overflows with VLAs.
Use type-safe container lookups instead of relying on lots of casts and macros.
Use base class for entities; avoid lots of casts.
Force casts to specify just how dangerous they intend to be.
Achieve const-correctness (finally!). Yet another nasal demon slain.
Add an (optional) backup system to 'make install'.
Don't crash if we get nothing when we request nothing.
Refactor out some completely unnecessary and occasionally code from the atcommand list.
Use standard randomness instead of rolling our own.
Rotate logs in the background, avoiding periodic freezes.
Kill a lot of macros.
Remove (almost) all skills not actually used by TMW. This made a *lot* of code pretty.
Fix a bug with self-destructing mobs, where one of the self-destruct hooks never triggered.
Remove a lot of hard-coded checks for item and mob IDs.
Remove support for disguising mobs and PCs.
kill all va_lists, fix exposed bugs.
Remove ad-hoc french translation of ladmin.
Delete a bunch of old tools I couldn't support.
add getmap and getmapflag functions
Fix potential issues related to time passing while no time passes.
Add a unit testing framework.
trim stuff related to nonexistent GRF. Strictify the resnametable and move it from common to map.
Add intern pools. Not used everywhere yet, but magic is being evil.
Automatically backup every save. This is not dependent on actually being able to save successfully.
Add matrix class - do less math manually.
Made implementation password hashing *slightly* less insane. It's still not pretty as we can't break compatibility with the old savefiles yet. I'll probably migrate this after databases, and do one final purge.
Don't potentially expose the server password to GMs.
Check for null pointers slightly better.
Add a bunch of utility functions to deal with randomness better.
Approach the softlimit less intrusively; make impossible things harder.
Manage a lot of pointers, especially the session (which is *different* between servers!).
Strictly differentiate between (absolute) ticks and (relative) intervals.
Stuff related to traits (still need to delocalize ints though).
Replace custom timer queue with standard one.
Do nothing explicitly instead of implicitly.
Document that interval timers must be detached; merge the implementation of interval timers.
Move a bunch of utilities (checks, config parsers, ip and timestamp printing) into one place instead of copypasta.
Remove all raw-level manual memory management. There is still some higher-level manual memory management waiting on the magic rewrite, however.
Remove support for old versions of the savefile that have never been used by TMW.
Remove useless sorting of the savefiles.
Flatten some deeply nested conditionals. When needed, use goto (it's cleaner, until a network rewrite happens!).
Remove check for whether the client supports update hosts, since all supported clients do.
Remove support for client-password-hashing (unsupported by TMW clients).
Remove login sessions as they are no longer needed.
Remove support for custom date formats (dangerous).
Avoid pointer math in ip ban/except lists.
Use a consistent argument-quoting system for ladmin.
Disallow partial matches in ladmin commands (the help still needs to be updated, but that will probably wait until the whole dispatcher is rewritten. Since ladmin has the smallest user exposure, it is the lowest priority, but it is also a good task for someone else as it does not involve much coordination).
Remove support for separately-typed passwords.
Verify email format "better". Yeah, the only real way is to send mail to it ...
Remove useless headers of ladmin and login.
Remove day-night system.
Parse @commands semiconsistently. This can't use a sane parser because it is possible that there are old clients relying on the old behavior.
Replace the implementation of @command logging.
Remove support for a custom @command symbol.
Change something about @heal.
Templatize the @param
(more stuff, but I want to post this before I get sick of it)
The following script builtins and @commands were removed (some names may be inaccurate; this is the internal name):
callsub/callfunc with arguments; return with an argument; getarg.
jobchange
copyarray
deletearray
getitem2
cutin
cutincard
viewpoint
getpartyname
getpartymember
getguildsname
getguildmaster
getguildmasterid
getbrokenid
repair
getequipisequiped
getequipisenableref
getequipisidentify
getequiprefinerycnt
getequipweaponlv
getequippercentrefinery
successrefitem
failedrefitem
statusup (but not statusup2)
bonus3 (but not bonus or bonus2)
guildskill
getgdskilllv
basicskillcheck
break (but not end)
checkoption
setoption
checkcart
setcart
checkfalcon
setfalcon
checkriding
setriding
save (but not savepoint)
gettimestr (but not gettime)
guildopenstorage
itemskill
doevent (but not donpcevent)'
deltimer
addtimercount
areaannounce (but not mapannounce)
enablearena
disablearena
hideoffnpc
hideonnpc
sc_start2 (but not sc_start)
getscrate
resetlvl
resetskill
changebase
waitingroom
warpwaitingpc (twice!)
delwaitingroom
enablewaitingroomevent
disablewaitingroomevent
getwaitingroomstate
setmapflagnosave (but not the equivalent mapflag)
gvgon
gvgoff
maprespawnguildid
agitstart
agitend
agitcheck
flagemblem
getcastlename
getcastledata
setcastledata
requestguildinfo
getequipcardcnt
successremovecards
failedremovecards
inittimer (but not initnpctimer or addtimer)
stoptimer (but not stopnpctimer)
wedding
getanchorinvocation
getskilllist
getpoolskilllist (but not getactivatedpoolskilllist or getunactivatedpoolskilllist)
checkpoolskill
clearitem
classchange
soundeffect
strmobinfo
guardian
guardianinfo
npcskilleffect
hasitems
@guildstorage
@gvgon
@gvgoff
@go
@refine
@produce
@memo
@guildlevelup
@night
@day
@allskills
@guild
@agitstart
@agitend
@mount_peco
@char_mount_peco
@guildspy
@guildrecall
@jail
@unjail
@disguise
@undisguise
@ignorelits
@charignorelist
@inall
@exall
@chardisguise
@charundisguise
@follow
@skillon
@skilloff
@chardye
@charhairstyle
@charhaircolor
@skillid
@useskill
@unmute
Many of the items on that list are still subject to further changes.
o11c wrote:The following script builtins and @commands were removed
While refactoring efforts are really impressive, after reading this part I could admit TMWA now deserves the title of "most castrated and featureless RPG server software you can get".
o11c wrote:The following script builtins and @commands were removed
While refactoring efforts are really impressive, after reading this part I could admit TMWA now deserves the title of "most castrated and featureless RPG server software you can get".
I made sure not to touch anything that was actually used.
And at this point, the highest priority is to clean up TMWA so that such things can sanely be added. The less things need to be *directly* translated, the better.
o11c wrote:I made sure not to touch anything that was actually used.
Didn't you say that @chardisguise shouldn't be used, even though it is?
I was mostly talking about script commands, since I haven't purged @commands thoroughly, just the few commands that absolutely needed to be removed or could be shown to have no effect.
In general, you should *not* touch a @99 command unless you know *exactly* what it does; many of them are outright dangerous. Without looking too deeply, that probably means only @mapexit and @kickall.
Some commands that are particularly dangerous are the @reload* commands. If they are used, I can offer absolutely no guaranteeds.
There is nothing more dangerous in this field than "it seems to work, it must be correct". I don't claim that my code is perfect, but I *do* claim that if it fails, it will fail predictably. This could not be said of TMWA before.
wushin wrote:What are the chances @disguise or some similar element to change the PCs model will be added back?
It depends on how quickly I am able to make the necessary infrastructure changes to be sure it's safe.
wushin wrote:wedding built-in removed meaning we rely on the magic one instead?
the 'wedding' command as used by eAthena was just a hard-coded call to one of the other effect functions. I don't think that particular effect is understood by TMW clients.
wushin wrote:I thought some of the removed were just aliases or doable with another command? Is there anyway to denote what should be used instead in that case?
I did not list atcommands if they had multiple versions previously and some were removed, since I made format changes to their dispatcher.
I *did* list script command exact duplicates that were removed, but the only ones I think were 'break' (-> 'end') and 'save' (-> 'savepoint').