The Plugify JavaScript Language Module enables developers to write plugins in modern JavaScript (ECMAScript 2023) and run them using the high-performance V8 engine. With this module, you can harness the flexibility of JavaScript while fully integrating into the Plugify plugin ecosystem.
- JavaScript-Powered Plugins: Write your plugins entirely in JavaScript using familiar syntax and tools.
- Seamless Integration: Integrate JavaScript plugins smoothly into the Plugify system alongside other supported languages.
- Cross-Language Communication: Interact effortlessly with plugins written in C++, Python, Lua, and more.
- Sandboxed Execution: Run JavaScript code safely in a sandboxed V8 environment with controlled access to native APIs.
- Valve CS_Script Integration: Access Counter-Strike 2's native CS_Script scripting system directly from your Plugify plugins, enabling seamless integration with game entities, events, and functionality.
Valve CS_Script Integration
Spoiler
The V8 Language Module provides unique integration with Valve's CS_Script scripting system Through the s2sdk plugin, you can dynamically import and use CS_Script modules alongside your Plugify plugins, creating powerful hybrid solutions that leverage both systems.
- Dynamic Module Loading: Import CS_Script modules like
cs_script/point_scriptat runtime - Full CS_Script API Access: Use Valve's native scripting APIs for game entities, events, and game logic
- Hybrid Plugin Development: Combine Plugify's multi-language ecosystem with CS_Script's game-specific functionality
- Seamless Integration: Automatically detect when CS_Script becomes available and load modules dynamically
import { Plugin } from 'plugify';
import * as s2sdk from ':s2sdk';
export class HybridPlugin extends Plugin {
pluginStart() {
s2sdk.OnEntityCreated_Register(HybridPlugin.OnEntityCreated);
}
static OnEntityCreated(entityHandle) {
const className = s2sdk.GetEntityClassname(entityHandle);
if (className === "point_script") {
setTimeout(() => {
// Dynamically import CS_Script modules after point_script is created
import("cs_script/point_script").then(point_script => {
const { Instance } = point_script;
console.log("✓ CS_Script system connected!");
Instance.Msg("✓ CS_Script integration active!");
// Use CS_Script functionality
Instance.SetThink(() => {
Instance.Msg("Think function executing...");
return Instance.GetGameTime() + 5.0;
});
Instance.SetNextThink(Instance.GetGameTime());
});
}, 100);
}
}
}Note: CS_Script modules must be imported dynamically after the point_script entity is created, as Plugify plugins load earlier than Valve's scripting system becomes available.
For comprehensive documentation on CS_Script integration, see the CS_Script System Integration Guide.
Learn more about Valve's CS_Script system:
- JavaScript
ES6is recommended. - Plugify Framework Installed
- For CS_Script integration: s2sdk plugin installed
mamba install -n your_env_name -c https://untrustedmodders.github.io/plugify-module-v8/ plugify-module-v8-
Install dependencies:
a. Windows
Setting up CMake tools with Visual Studio Installer
b. Linux:
sudo apt-get install -y build-essential cmake ninja-build
c. Mac:
brew install cmake ninja
-
Clone this repository:
git clone https://github.com/untrustedmodders/plugify-module-v8.git --recursive
-
Build the JavaScript language module:
mkdir build && cd build cmake .. cmake --build .
-
Integration with Plugify
Ensure that your JavaScript language module is available in the same directory as your Plugify setup.
-
Write JavaScript Plugins
Develop your plugins in JavaScript using the Plugify V8 API. Refer to the Plugify JavaScript Plugin Guide for detailed instructions.
-
Build and Install Plugins
Put your JavaScript files in a directory accessible to the Plugify core.
-
Run Plugify
Start the Plugify framework, and it will dynamically load your JavaScript plugins.
import { Plugin } from 'plugify';
export class ExamplePlugin extends Plugin {
pluginStart() {
console.log('ExamplePlugin::pluginStart');
}
pluginUpdate(dt) {
console.log('ExamplePlugin::pluginUpdate');
}
pluginEnd() {
console.log('ExamplePlugin::pluginEnd');
}
}assertProvides a set of assertion testsassert.ok()Checks if a value is true.assert.equal()Checks if two values are equal, using the equal operator (==).assert.notEqual()Checks if two values are not equal, using the not equal operator (!=)
bufferTo handle binary data- TODO
consoleConsole object.console.log()Outputs a message to the console.console.info()Outputs a message to the console.console.warn()Outputs a message to the console.console.error()Outputs a message to the console.console.debug()Outputs a message to the console.
child_processTo run a child process- TODO
clusterTo split a single Node process into multiple processes- TODO
cryptoTo handle OpenSSL cryptographic functions- TODO
dgramProvides implementation of UDP datagram sockets- TODO
dnsTo do DNS lookups and name resolution functions- TODO
eventsTo handle events- TODO
fsTo handle the file system -fs.rename()rename the file.fs.exists()fs.rmdir()remove the dir.fs.mkdir()create the dir.fs.stat()get the stat of the given pathname.fs.readdir()read the directory.fs.readFile()read the file of the given pathname.fs.writeFile()write the file of the given pathname and bytes/string.fs.appendFile()append to the file of the given pathname and bytes/string.
httpTo make Node.js act as an HTTP server- TODO
httpsTo make Node.js act as an HTTPS server.- TODO
netTo create servers and clients- TODO
osProvides information about the operation systemos.tmpdir()Returns the operating system's default directory for temporary files.os.homedir()Returns the operating system's home directory.os.endianness()Returns the endianness of the CPU.os.type()Returns the name of the operating system.os.platform()Returns information about the operating system's platform.os.arch()Returns the operating system CPU architecture.
pathTo handle file pathspath.normalize()normalize the path string.path.join()Joins the specified paths into one.path.resolve()Resolves the specified paths into an absolute path.path.isAbsolute()return if a path is in absolute.path.relative()normalize the path string.path.dirname()return the directory name of the path.path.basename()return the basename of the path.path.extname()return the ext name.
querystringTo handle URL query strings- TODO
readlinTo handle readable streams one line at the time- TODO
streamTo handle streaming data- TODO
string_decoderTo decode buffer objects into strings- TODO
timersTo execute a function after a given number of millisecondstimers.setTimeout()Executes a given function after a given time (in milliseconds).timers.clearTimeout()Cancels a Timeout object.
tlsTo implement TLS and SSL protocols- TODO
ttyProvides classes used by a text terminal- TODO
urlTo parse URL strings- TODO
utilTo access utility functions- TODO
v8To access information about V8 (the JavaScript engine)- TODO
vmTo compile JavaScript code in a virtual machine- TODO
zlibTo compress or decompress files- TODO
For comprehensive documentation on writing plugins in JavaScript using the Plugify framework, refer to the Plugify Documentation.
Feel free to contribute by opening issues or submitting pull requests. We welcome your feedback and ideas!
This JavaScript (V8) Language Module for Plugify is licensed under the MIT License.