=============================================================================== Zombie:Reloaded Technical Manual For Developers Targets plugin version 3.0.0, (not released) Written by Richard Helgeby Manual last modified: 2009.04.25 =============================================================================== INDEX ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1.0 . . Introduction 1.1 . . . About This Manual 1.2 . . . Briefing 2.0 . . Plugin Core 2.1 . . . Startup 2.2 . . . Console Variables 2.3 . . . Translations 2.4 . . . Offsets 2.5 . . . Models 2.6 . . . Round End Handler 2.7 . . . Infection Handler 2.8 . . . Damage Handler (account) (say hooks) (menu) (commands) (events) 3.0 . . Log Module 3.1 . . . Description 3.2 . . . Logging Flags And Filters 3.3 . . . Formatted Log Messages 3.4 . . . The Log Function 4.0 . . Class Module 5.0 . . Weapon Module 6.0 . . Hit Groups Module 7.0 . . Visual Effects Module 8.0 . . Sound Effects Module 9.0 . . Anti-Stick Module 10.0 . Knockback Module 11.0 . Respawn Module 12.0 . Spawn Protect Module 13.0 . Napalm Grenades Module 14.0 . HP Display Module 15.0 . Teleport Module 1.0 INTRODUCTION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1.1 ABOUT THIS MANUAL ------------------------ The point of this manual is to describe how the plugin technically works so it's easier for other developers to make modifications or join the development. 1.2 BRIEFING --------------- The entire plugin is based on events in the game. It has a lot of features and each feature is separated in its own module. Events are then forwarded to those modules. There are core modules and optional modules. Core modules is features and stuff that cannot be disabled and is required for the plugin to function. Optional modules like respawning, sound effects or weapon restrictions can be disabled. Each module takes care of its own task. But modules have dependency, and events should be forwarded in correct order. Usually only core modules depends on other core modules. Optional modules should be independent. 2.0 PLUGIN CORE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3.0 LOG MODULE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3.1 DESCRIPTION ------------------ A plugin with a lots of modules and events needs a good logging system. The user should be able to decide what's logged with logging flags. 3.2 LOGGING FLAGS AND FILTERS -------------------------------- The log system decides what to log based on some generic log flags. Those flags are stored in a bid field (http://en.wikipedia.org/wiki/Bit_field). An optional module filter can be enabled to only allow log events from user specified modules. For performance reasons there should be a single function that tells whether it should log or not, based on the specified module and generic event. The logging function itself should not do such check and always log a message when called. (incomplete) How to store module flags? Key/values? Reading those flags MUST be cheap, so the overall plugin performance isn't affected. 3.3 FORMATTED LOG MESSAGES ----------------------------- Each log message should tell the module and what part of it that fired the log event. Also it must be possible to supply additional info as parameters (the "any:..." parameter) to be used in the log message. These are easily' parsed with VFormat. 3.4 THE LOG FUNCTION ----------------------- Syntax: LogMessageFormatted(client, const String:module[], const String:block[], const String:message[], type = LOG_FORMAT_TYPE_FULL, any:...) Parameter: Description: --------------------------------------------------------------------------- client Specifies what client that triggered the event. Use -1 for core events. module What module the event was triggered in. block What function or block that triggered the event. message The log message. Can be formatted. type Optional. Specifies what log type to use. Defaults to full. any:... Formatting parameters for the log message. Example usage with flag check: if (LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_CLASSES)) { LogMessageFormatted(-1, "Classes", "Load", "Warning: Maximum classes reached (%d). Skipping other classes.", _, ZR_CLASS_MAX + 1); } The module check will be replaced with something other than defined constants.