Author: 1u2tqe51uojr

  • laravel-vonage-inbound-sms

    Vonage Inbound SMS Webhooks Client for Laravel

    Packagist GitHub-tag License Downloads GH-Actions codecov

    Handle Vonage inbound SMS webhooks in Laravel php framework.

    Installation

    You can install the package via composer:

    composer require "ankurk91/laravel-vonage-inbound-sms"

    The service provider will automatically register itself.

    You must publish the config file with:

    php artisan vendor:publish --provider="Ankurk91\Vonage\SMS\Inbound\VonageWebhooksServiceProvider"

    Next, you must publish the migration with:

    php artisan vendor:publish --provider="Spatie\WebhookClient\WebhookClientServiceProvider" --tag="webhook-client-migrations"

    After the migration has been published you can create the webhook_calls table by running the migrations:

    php artisan migrate

    Next, for routing, add this route (guest) to your routes/web.php

    Route::vonageInboundSMS('webhooks/vonage/sms/inbound');

    Behind the scenes this will register a POST route to a controller provided by this package. Next, you must add that route to the except array of your VerifyCsrfToken middleware:

    protected $except = [
        '/webhooks/*',
    ];

    It is recommended to set up a queue worker to precess the incoming webhooks.

    Setup Vonage account

    • Login to Vonage developer dashboard
    • Enter your webhook URL under “Inbound SMS webhooks”.
    • πŸ’‘ You can use ngrok for local development
    • Copy the “Signature secret” and specify in your .env file like
    VONAGE_WEBHOOK_SECRET=secret-key-here
    • Select HASH_MD5 as your Signature method
    • Select POST_JSON as your Webhook format

    Note You may need to contact Vonage support in-order to make Message Signing work on your account.

    Troubleshoot

    When using ngrok during development, you must update your APP_URL to match with ngrok vanity URL, for example:

    APP_URL=https://af59-111-93-41-42.ngrok-free.app

    You must verify that your webhook URL is publicly accessible by visiting the URL on your terminal

    curl -X POST https://af59-111-93-41-42.ngrok-free.app/webhooks/vonage/sms/inbound

    Usage

    There are 2 ways to handle incoming webhooks via this package.

    1 – Handling webhook requests using jobs

    If you want to do something when a specific event type comes in; you can define a job for that event. Here’s an example of such job:

    <?php
    
    namespace App\Jobs\Webhook\Vonage\SMS\Inbound;
    
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Queue\SerializesModels;
    use Spatie\WebhookClient\Models\WebhookCall;
    
    class TextSMSJob implements ShouldQueue
    {
        use InteractsWithQueue, Queueable, SerializesModels;
    
        public function __construct(protected WebhookCall $webhookCall)
        {
            //
        }
    
        public function handle()
        {      
            $message = new \Vonage\SMS\Webhook\InboundSMS($this->webhookCall->payload);
                
            // todo do something with $message        
        }
    }

    After having created your job you must register it at the jobs array in the config/vonage-inbound-sms.php config file. The key must be in lowercase and dots must be replaced by _. The value must be a fully qualified classname.

    <?php
    
    return [
         'jobs' => [
              'text' => \App\Jobs\Webhook\Vonage\SMS\Inbound\TextSMSJob::class,
         ],
    ];

    2 – Handling webhook requests using events and listeners

    Instead of queueing jobs to perform some work when a webhook request comes in, you can opt to listen to the events this package will fire. Whenever a matching request hits your app, the package will fire a vonage-inbound-sms::<name-of-the-event> event.

    The payload of the events will be the instance of WebhookCall that was created for the incoming request.

    You can listen for such event by registering the listener in your EventServiceProvider class.

    protected $listen = [
        'vonage-inbound-sms::unicode' => [
            \App\Listeners\Vonage\SMS\Inbound\UnicodeSMSListener::class,
        ],
    ];

    Here’s an example of such listener class:

    <?php
    
    namespace App\Listeners\Vonage\SMS\Inbound;
    
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Spatie\WebhookClient\Models\WebhookCall;
    
    class UnicodeSMSListener implements ShouldQueue
    {
        public function handle(WebhookCall $webhookCall)
        {
            $message = $webhookCall->payload;
                   
            // todo do something with $message        
        }
    }

    Pruning old webhooks (opt-in but recommended)

    Update your app/Console/Kernel.php file like:

    use Illuminate\Database\Console\PruneCommand;
    use Spatie\WebhookClient\Models\WebhookCall;
    
    $schedule->command(PruneCommand::class, [
                '--model' => [WebhookCall::class]
            ])
            ->onOneServer()
            ->daily()
            ->description('Prune webhook_calls.');

    This will delete records older than 30 days, optionally you can modify this duration by publishing this config file.

    php artisan vendor:publish --provider="Spatie\WebhookClient\WebhookClientServiceProvider" --tag="webhook-client-config"

    Changelog

    Please see CHANGELOG for more information what has changed recently.

    Testing

    composer test

    Security

    If you discover any security issue, please email pro.ankurk1[at]gmail[dot]com instead of using the issue tracker.

    Useful Links

    Acknowledgment

    This package is highly inspired by:

    License

    This package is licensed under MIT License.

    Visit original content creator repository https://github.com/ankurk91/laravel-vonage-inbound-sms
  • mesh-viewer


    Logo

    MeshViewer

    A simple mesh viewer made with Qt
    Features Β· Controls Β· Installation


    This is a basic mesh viewer made with Qt on C++ that allows you to display 3D meshes.

    Face only

    Features

    MeshViewer allows you to display 3D objects of .ply, .obj & .stl formats. You can adjust various color properties of the object. You can set the lighting, diffuse, ambient and specular colors. MeshViewer allows you to render 3D objects in “Face only”, “Face + Wireframe” and “Wireframe” mods, with modifiable wireframe line width & color:

    Face only Face + Wireframe Wireframe only

    Face only

    MeshViewer has an option for you to change between flat and smooth shading modes with adjustable light intensity. This is achieved via computing normals in slightly different ways in the fragment shader

    Face only Face + Wireframe

    This project uses Qt 5.12 for user interface, and OpenGL for graphical effects. MeshViewer includes the custom camera controller class, a mesh class with custom material, and GLSL shaders for custom effects (wireframe + flat shading). Custom features were implemented for the sake of better flexibility of the program. In the “test-meshes” directory you can find some basic models that you can display in the program, but anything of the .ply, .obj, and .stl format will be ok as well.

    Controls

    Left Mouse Button : Rotate mesh

    W/S || ⇧/⇩ : Rotate mesh (z axis)

    A/D || ⇦/⇨ : Rotate mesh (x axis)

    Mouse Wheel : Zoom in/out

    Ctrl + N : New empty scene

    Ctrl + O : Open new file

    Ctrl + Q : Quit

    Installation

    Currently, the best installation option is to compile from source .

    However, you can download the DistributionKit.zip archive based in the root folder of this repo and run the .sh script. It may require you to install the dependencies required by MeshViewer. This installation option is not tested properly. Work in progress.

    Visit original content creator repository https://github.com/Stegogo/mesh-viewer
  • mesh-viewer


    Logo

    MeshViewer

    A simple mesh viewer made with Qt
    Features Β· Controls Β· Installation


    This is a basic mesh viewer made with Qt on C++ that allows you to display 3D meshes.

    Face only

    Features

    MeshViewer allows you to display 3D objects of .ply, .obj & .stl formats. You can adjust various color properties of the object. You can set the lighting, diffuse, ambient and specular colors. MeshViewer allows you to render 3D objects in “Face only”, “Face + Wireframe” and “Wireframe” mods, with modifiable wireframe line width & color:

    Face only Face + Wireframe Wireframe only

    Face only

    MeshViewer has an option for you to change between flat and smooth shading modes with adjustable light intensity. This is achieved via computing normals in slightly different ways in the fragment shader

    Face only Face + Wireframe

    This project uses Qt 5.12 for user interface, and OpenGL for graphical effects. MeshViewer includes the custom camera controller class, a mesh class with custom material, and GLSL shaders for custom effects (wireframe + flat shading). Custom features were implemented for the sake of better flexibility of the program. In the “test-meshes” directory you can find some basic models that you can display in the program, but anything of the .ply, .obj, and .stl format will be ok as well.

    Controls

    Left Mouse Button : Rotate mesh

    W/S || ⇧/⇩ : Rotate mesh (z axis)

    A/D || ⇦/⇨ : Rotate mesh (x axis)

    Mouse Wheel : Zoom in/out

    Ctrl + N : New empty scene

    Ctrl + O : Open new file

    Ctrl + Q : Quit

    Installation

    Currently, the best installation option is to compile from source .

    However, you can download the DistributionKit.zip archive based in the root folder of this repo and run the .sh script. It may require you to install the dependencies required by MeshViewer. This installation option is not tested properly. Work in progress.

    Visit original content creator repository https://github.com/Stegogo/mesh-viewer
  • chip8c

    chip8c

    This project is an interpreter and virtual machine for chip-8. Chip-8 is an interpreted programming language that allows for simple games to be ported to a range of systems from computers to phones to graphing calculators. While commonly referred to as an emulator, in beginning projects such as this one, the chip8 system has always been a virtual machine and was not originally implemented on hardware. If one wanted to run chip-8 games on a given platform, one would implement an interpreter/virtual machine such as this one.

    Key mappings

    |_ 1_ 2_ 3_ 4|Β Β Β Β Β Β Β Β |_ 1_ 2_ 3_ 4|
    |_ 5_ 6_ 7_ 8|Β Β Β =>Β |_ q_ w_ e_ r|
    |_ 9_10_11_12|Β Β Β =>Β |_ a_ s_ d_ f|
    |13_14_15_16|Β Β Β Β Β Β Β Β | z_ x_ c_ v|

    Note: Key mappings vary by game so you have to get a feel for each game.

    Mac Installation

    To install, simply copy and and paste the following command to the terminal in the project directory:

    gcc -o chip8c -Wall main.c sdl_helpers.c chip8.c -I/Library/Frameworks/SDL2.framework/Headers -F/Library/Frameworks -framework SDL2

    Then to run enter the command:

    ./chip8c “game name”

    A pack of public domain games is available here.

    Demo

    CHIP8C demo

    Visit original content creator repository https://github.com/nathanbacon/chip8c
  • rlenv

    RLEnv – docker image to deploy an RL environment

    This docker image provides an easy way to rollout an Ubuntu 16.04 enviroment that is suitable for RL. It contains many preinstalled libraries, and allows VNC and IPython Notebook access. The following tools are preinstalled in the image:

    • Anaconda Python 3.6
    • PyTorch 0.3
    • CUDA 8.0
    • OpenAI Gym 0.9.4
    • MuJoCo 1.31 (in order to use MuJoCo you need to put your key mjket.txt into the root folder)
    • pysc2 1.2
    • VNC
    • Visdom

    Rollout

    Make sure you install nvidia-docker to work with this image. Then, you can create a container by running:

    nvidia-docker build -t rlenv .
    

    And start the container via:

    nvidia-docker run -v {LOCAL_CODE_DIR}:/workspace/code -it -p 5902:5900  -p 8888:8888 -p 8097:8097 --rm rlenv
    

    This will run the container, open up VNC port (5902), ipython notebook port (8888), Visdom port (8097), as well as mount a local folder of your choice (need to replace {LOCAL_CODE_DIR}) to the container’s /workspace/code. You will be directed to a shell with Anaconda enviroment (Python 3.6) enabled.

    VNC

    To access the graphical interface, launch your favourite VNC client (for example Screen Sharing in MacOS) and use localhost:5902 for the host, and 123456 for the password.

    Visit original content creator repository
    https://github.com/denisyarats/rlenv

  • automationsy

    AutomationSy Documentation

    πŸ’‘ Introduction

    This documentation is in πŸ‡ΊπŸ‡Έ English, however the Portuguese documentation from πŸ‡§πŸ‡· Brazil is available by clicking here

    AutomationSy is a test automation tool dedicated to QA.

    However, the lib is only focused on automating tests dealing with page elements and actions with high speed.

    AutomationSy has puppeteer as its core or dependency, in which it can connect with the browser and carry out interactions through a very extensive coding. Unlike puppeteer, AutomationSy becomes a solution that the user who is programming the tests, has less code effort and faster coding scenarios.


    πŸ’Ύ Installation

    Just clone the project or download the project to your environment.

    git clone https://github.com/charleslana/automationsy.git

    πŸ”§ Initial setup

    Node installed required

    Run the installation of dependencies

    npm i

    πŸ“„ Detailed documentation/API

    You can access the documentation site here


    πŸ“ How to create my tests?

    const { Action, Config, Resource } = require('automationsy');
    
    (async () => {
      Config.setHeadless(true);
      await Action.navigate('https://github.com/charleslana');
      await Resource.getText('.vcard-fullname');
      await Action.closeBrowser();
    })();

    ⏱️ Running the tests

    Javascript

    node test.js

    Typescript

    tsc && node build/test.js

    πŸ“Œ Which operating system does it support?

    It has been tested on Linux only, you can test to see if it works on other OS.


    πŸ’ͺ Contribution

    Since the project is free to use as per the license, you can contribute new ideas and improvements, stay free to comment, fork, create a pull request, or open an issue.

    Contributions are always welcome!

    See CONTRIBUTING.md for how to get started.

    Please follow the CODE_OF_CONDUCT.md of this project.


    πŸŽ₯ Demo

    Access the demo recorder and use YouTube


    πŸ“„ License

    GPLv3 License


    πŸ“’ Author

    Visit original content creator repository https://github.com/charleslana/automationsy
  • archive

    You have reached the IJRU Archive. This archive attempts to collect
    documents published by international Jump Rope / Rope Skipping organisations.
    Generally, only documents that has once been publicly published will be
    available via this archive.

    Principles

    • Non-revisionistic: Items will not be removed or replaced, even if the
      future considers them embarrassing.
    • Consistent: The structure and naming used in this archive should be
      consistent.
    • Persistent: If you link to an item in this archive, you should feel
      confident that the link will continue to work.
    • Redundant: The archive should strive to create copies of itself with
      organisations who’s goal is archiving.
    • Unbiased: The archive should strive to create an accurate record of all
      past and future rope skipping organisations, with a priority on international
      ones.

    Contributing

    This archive is far from complete, several organisations and several items of
    interest are missing. Known missing items are listed under issues.
    If you have access to items that you believe might be of interest to the
    archive, please contact us on archive@ijru.sport or
    create a pull request. If you intend to create a pull request, make sure you
    adhere to the naming scheme and guidelines set out below.

    Mirroring

    After you have published a new document to the archive, go to
    the Internet Archive’s save page,
    and save https://archive.ijru.sport/sitemap.xml with “Save outlinks” selected

    Naming Scheme

    Files

    For files, the following structure sets a baseline, if you have a file that
    cannot be named with the following structure, contact the maintainer(s) of
    the archive to work out a suitable solution and establish a convention for the
    future.

    When choosing files, try to select editions in open and widely used formats such
    as pdf, mp3, wav, json. Try to avoid proprietary formats such as docx or xlsx.
    If you have a zip file or other archive filetype, prefer unzipping it and
    including its contents directly as this makes them easier to search for and
    catalogue.

    1. Versionβ€”different organisations use different ways of
      indicating version, the two main ones are version number or year(s).
      Some files also doesn’t have a “version”, competition results is a good
      example of this. Use the year in those cases. If results are revised after
      their initial publication you could append a “tag”, such as -revised.
      The version should be written in brackets ([]), followed by a single space.
      Examples:
      [1.1] : version 1.1
      [1.1-pr.1] : version 1.1 with tag pr.1 (could be pre-release 1)
      [1.1-dec2020] : The December 2020 edition of version 1.1
      [2020] : 2020’s edition
      [2019-2020] : version effective 2019-2020
      [2019-2020-v2] : version 2 of the 2019-2020 version
    2. Language (optional)β€”If the file is published in
      multiple languages, include the language’s two-letter
      ISO 639-1 language code in parenthesis (()), followed by a
      single space. Examples:
      (en) : English
      (de) : German
    3. Organisation Acronymβ€”Include the acronym of the organisation in
      capital letters, followed by a single space. Examples:
      IJRU : International Jump Rope Union
      FISAC-IRSF : International Rope Skipping Federation
      WJRF : World Jump Rope Federation
    4. Name of File Collection (optional)β€”If the file is part of a
      “collection” include the name of that collection in full, followed by a space,
      a dash, and another space. Examples:
      Rule Book - ,
      Timing Tracks - ,
      World Championships Results -
    5. Name of File–The fully spelled out, human readable name of the
      file. Examples:
      Constitution,
      Judging Manual,
      Single Rope Speed Relay,
      Mixed Team
    6. File Extensionβ€”End with the file extension. Examples:
      .pdf, .mp3

    Complete Examples:

    • [1.0] IJRU Constitution.pdf
    • [1.1] (de) ERSO Constitution.pdf
    • [2016] WJRF Junior World Jump Rope Championship Results - Male Single Rope Speed Sprint.pdf
    • [1.0.0-draft.1] IJRU Rule Book - Competition Manual.pdf
    • [2016] FISAC-IRSF Timing Tracks - Double Dutch Speed Relay 4x45.mp3

    Directories

    As for directories, try to name them using “url-safe” characters, in general try
    to use only lowercase letters (a-z), numerals (0-9) and dashes (-) to form
    english words. Use pluralised forms for folders that might contain several types
    of that file category, use singular for one specific document type and its
    versions. Use singular for names.

    Complete examples:

    • ijru
    • by-laws
    • 2020
    • rule-books
    • ethics-panel

    Sorting

    In short, create subdirectories to logically group documents together, but don’t
    just create subdirectories to create subdirectories. Try to have a maximum
    of three levels of directories
    unless it cannot be avoided or makes it harder
    to navigate. the general structure is that the first level is the organisation,
    the second level is the “category”https://github.com/”type” and the third level is “collection”
    if the file in question is made up of several files for each version.

    For example: ijru/constitution/ only really needs two levels as it’s unlikely
    the constitution will ever consist of multiple documents, but
    ijru/rule-books/v1.0.0/ is well justified to have a third level as it consists
    of both a Judging Manual and a Competition Manual, and it’s likely it will have
    different types of rule books in the future. Competition results are also a good
    example of something where three levels are justified as each competition as
    they commonly consists of one file per competition event.

    Commits

    Try to use scoped commit names, start with lowercase organisation, optionally
    add which collection (directory) you are adding files to in parenthesises, and
    after that provide a short one line description about the document(s) you’re
    adding. If you need to provide a detailed list or more information enter that
    in the body/following lines of the commit, separated by a blank line.

    Try to only add files to one collection at a time, as in try to make sure each
    commit contains only files related to each other.

    Examples:

    ijru(constitution): Add v2.0 of IJRU Constitution
    

    ijru(rule-book): Add v3.0.0 of IJRU Rule Book
    
    Includes Judging Manual and Competition Manual
    
    wjrf(results): Add 2008 WJRCC results
    

    Visit original content creator repository
    https://github.com/ijru/archive

  • WarcraftIII_DLL_126-xxx

    WarcraftIII_DLL_126-127

    Improvements for Warcraft III 126a and 127a, used in new DoTA (d1stats.ru)

    Features:

    “Attack Speed” and “Magic amplification” More unit info

    “Move Speed” and “Magic Protection” More unit info

    “Widescreen support”

    (Widescreen support disabled:)

    Widescreen off

    (Widescreen support enabled:)

    Widescreen on

    “Ally skill view” Ally skill viewer

    “Ally manabar view” Ally manabar viewer

    RawImage update:

    // Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ RawImage (RGBA) с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ
    // Create RawImage with color
    int __stdcall CreateRawImage( int width, int height, RGBAPix defaultcolor )
    // Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ RawImage ΠΈΠ· filename (tga,blp)
    // Load RawImage from game file
    int __stdcall LoadRawImage( const char * filename )
    // РисуСт RawImage2 Π½Π° RawImage
    // Draw RawImage2 at RawImage
    int __stdcall RawImage_DrawImg( int RawImage, int RawImage2, int drawx, int drawy, int blendmode )
    // ЗаполняСт Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ пиксСль ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ
    // Fill pixel with color
    int __stdcall RawImage_DrawPixel( int RawImage, int x, int y, RGBAPix color )//RGBAPix = unsigned int
    // РисуСт ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ
    // Fill rectangle with color
    int __stdcall RawImage_DrawRect( int RawImage, int drawx, int drawy, int widthsize, int heightsize, RGBAPix color )
    // РисуСт линию с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ
    // Draw line with color
    int __stdcall RawImage_DrawLine( int RawImage, int x1, int y1, int x2, int y2, int size, RGBAPix color )
    // РисуСт ΠΊΡ€ΡƒΠ³ с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ радиусом, Ρ‚ΠΎΠ»Ρ‰ΠΈΠ½ΠΎΠΉ, Ρ†Π²Π΅Ρ‚ΠΎΠΌ
    // Draw circle with color
    int __stdcall RawImage_DrawCircle( int RawImage, int x, int y, int radius, int size, RGBAPix color )
    // ЗаполняСт ΠΊΡ€ΡƒΠ³ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ
    // Fill circle with color
    int __stdcall RawImage_FillCircle( int RawImage, int x, int y, int radius, RGBAPix color )
    // ΠžΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΡ€ΡƒΠ³ с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ радиусом
    // Erase circle
    int __stdcall RawImage_EraseCircle( int RawImage, int x, int y, int radius, BOOL inverse )
    // Π”Π΅Π»Π°Π΅Ρ‚ пиксСли с Ρ†Π²Π΅Ρ‚ΠΎΠΌ color - ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌΠΈ, power ΠΎΡ‚ 0 Π΄ΠΎ 255
    // Not working
    int __stdcall RawImage_EraseColor( int RawImage, RGBAPix color, int power )
    // Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΡˆΡ€ΠΈΡ„Ρ‚ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°
    // Load font from game file
    int __stdcall RawImage_LoadFontFromResource( const char * filepath )
    // УстанавливаСт настройки ΡˆΡ€ΠΈΡ„Ρ‚Π° для RawImage_DrawText
    // Set font settings for DrawText
    int __stdcall RawImage_SetFontSettings( const char * fontname, int fontsize, unsigned int flags )
    // ΠŸΠΈΡˆΠ΅Ρ‚ тСкст Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°Ρ… с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ Ρ†Π²Π΅Ρ‚ΠΎΠΌ ΠΈ настройками ΡˆΡ€ΠΈΡ„Ρ‚Π° RawImage_SetFontSettings
    // Draw text at RawImage
    int __stdcall RawImage_DrawText( int RawImage, const char * text, int x, int y, RGBAPix color )
    // БохраняСт RawImage Π² blp ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ доступным для использования Π² ΠΈΠ³Ρ€Π΅
    // Save RawImage to game file
    int __stdcall SaveRawImageToGameFile( int RawImage, const char * filename, BOOL IsTga, BOOL enabled )
    // БохраняСт RawImage Π½Π° диск Π² TGA ΠΏΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ
    // Save RawIamge to file
    int __stdcall DumpRawImageToFile( int RawImage, const char * filename )
    // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ RawImage ΠΈΠ· списка RawImages ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°.
    // Search RawImage by filename
    int __stdcall GetRawImageByFile( const char * filename )
    // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡˆΠΈΡ€ΠΈΠ½Ρƒ RawImage
    // Get width
    int __stdcall RawImage_GetWidth( int RawImage )
    // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ высоту RawImage
    // Get height
    int __stdcall RawImage_GetHeight( int RawImage )
    // Π˜Π·ΠΌΠ΅Π½ΡΠ΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ RawImage
    // Resize RawImage
    int __stdcall RawImage_Resize( int RawImage, int newwidth, int newheight )
    // РисуСт RawImage ΠΏΠΎ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌ (ΠΎΡ‚ 0.0 Π΄ΠΎ 1.0) Π² ΠΈΠ³Ρ€Π΅. МоТно ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ (ΠΎΡ‚ 0.0 Π΄ΠΎ 1.0).
    // Draw RawImage as overlay ingame. xsize / ysize not working in this version (use 0.0)
    int __stdcall RawImage_DrawOverlay( int RawImage, BOOL enabled, float xpos, float ypos, float xsize, float ysize )
    int __stdcall RawImage_EnableOverlay( unsigned int RawImage, BOOL enabled )
    int __stdcall RawImage_MoveTimed( unsigned int RawImage, float x2, float y2, unsigned int Time1, unsigned int Time2, unsigned int SleepTime )
    int __stdcall RawImage_SetPacketCallback( unsigned int RawImage, BOOL enable, unsigned int events )
    int __stdcall RawImage_AddCallback( unsigned int RawImage, const char * MouseActionCallback, RawImageCallbackData * callbackdata, unsigned int events )
    int __stdcall RawImage_IsBtn( unsigned int RawImage, BOOL enabled )
    

    “Example result:” RawImage Draw API

    CFrame API update:

    globals

    	integer testclickcount = 0
    
    
    	integer pCFrame_GetLastEventId = 0 
    	integer pCFrame_GetTriggerCFrame = 0
    	integer pCFrame_SetCustomValue = 0
    	integer pCFrame_GetCustomValue = 0
    	integer pCFrame_LoadFramesListFile = 0 
    	integer pCFrame_CreateNewFrame = 0 
    	integer pCFrame_LoadFrame = 0 
    	integer pCFrame_SetFrameType = 0 
    	integer pCFrame_SetFrameModel = 0 
    	integer pCFrame_SetFrameTexture = 0 
    	integer pCFrame_SetFrameText = 0 
    	integer pCFrame_SetAbsolutePosition = 0 
    	integer pCFrame_SetRelativePosition = 0 
    	integer pCFrame_Destroy = 0 
    	integer pCFrame_AddCallack = 0 
    	integer pCFrame_AddCallackPacket = 0 
    	integer pCFrame_Enable = 0
    	integer pCFrame_IsEnabled = 0
    	integer pCFrame_GetFrameAddress = 0
    	integer pCFrame_StartCustomAnimate = 0
    	integer	pCFrame_SetCustomAnimateOffset = 0
    	integer	pCFrame_StopCustomAnimate = 0
    	integer pCFrame_SetScale = 0
    	integer pCFrame_Show = 0
    	
    	integer CFrameBackType_ControlFrame = 0
    	integer CFrameBackType_ControlBackdrop = 1
    	integer CFrameBackType_ControlPushedBackdrop = 2
    	integer CFrameBackType_ControlDisabledBackdrop = 3
    
    	integer	CFramePosition_TOP_LEFT = 0
    	integer	CFramePosition_TOP_CENTER = 1
    	integer	CFramePosition_TOP_RIGHT = 2
    	integer	CFramePosition_LEFT = 3
    	integer	CFramePosition_CENTER = 4
    	integer	CFramePosition_RIGHT = 5
    	integer	CFramePosition_BOTTOM_LEFT = 6
    	integer	CFramePosition_BOTTOM_CENTER = 7
    	integer	CFramePosition_BOTTOM_RIGHT = 8
    
    	integer	FRAMETYPE_FRAME = 0
    	integer	FRAMETYPE_BACKDROP = 1
    	integer	FRAMETYPE_ITEM = 2
    	integer	FRAMETYPE_POPUPMENU = 3
    	integer	FRAMETYPE_EDITBOX = 4
    	integer	FRAMETYPE_BUTTON = 5
    	integer	FRAMETYPE_TEXTBUTTON = 6
    	integer	FRAMETYPE_SPRITE = 7
    	integer	FRAMETYPE_HIGHLIGHT = 8
    	integer	FRAMETYPE_SCROLLBAR = 9
    	integer	FRAMETYPE_MODEL = 10
    
    	integer FRAME_EVENT_PRESSED = 1
    	integer FRAME_MOUSE_ENTER = 2
    	integer FRAME_MOUSE_LEAVE = 3
    	integer FRAME_MOUSE_UP = 4
    	integer FRAME_MOUSE_DOWN = 5
    	integer FRAME_MOUSE_WHEEL = 6
    	integer FRAME_FOCUS_ENTER = FRAME_MOUSE_ENTER
    	integer FRAME_FOCUS_LEAVE = FRAME_MOUSE_LEAVE
    	integer FRAME_CHECKBOX_CHECKED = 7
    	integer FRAME_CHECKBOX_UNCHECKED = 8
    	integer FRAME_EDITBOX_TEXT_CHANGED = 9
    	integer FRAME_POPUPMENU_ITEM_CHANGE_START = 10
    	integer FRAME_POPUPMENU_ITEM_CHANGED = 11
    	integer FRAME_MOUSE_DOUBLECLICK = 12
    	integer FRAME_SPRITE_ANIM_UPDATE = 13
    	
    

    #endglobals

    #code

    
    
    function CFrame_GetLastEventId takes nothing returns integer
    	if pCFrame_GetLastEventId == 0 then
    		set pCFrame_GetLastEventId = GetModuleProcAddress(EXTRADLLNAME, "CFrame_GetLastEventId")
    	endif
    	if pCFrame_GetLastEventId != 0 then 
    		return CallStdCallWith1Args(pCFrame_GetLastEventId,0)
    	endif
    	return 0
    endfunction
    
    function CFrame_GetTriggerCFrame takes nothing returns integer
    	if pCFrame_GetTriggerCFrame == 0 then
    		set pCFrame_GetTriggerCFrame = GetModuleProcAddress(EXTRADLLNAME, "CFrame_GetTriggerCFrame")
    	endif
    	if pCFrame_GetTriggerCFrame != 0 then 
    		return CallStdCallWith1Args(pCFrame_GetTriggerCFrame,0)
    	endif
    	return 0
    endfunction
    
    function CFrame_GetCustomValue takes integer pCframe, integer ValueID returns integer
    	if pCFrame_GetCustomValue == 0 then
    		set pCFrame_GetCustomValue = GetModuleProcAddress(EXTRADLLNAME, "CFrame_GetCustomValue")
    	endif
    	if pCFrame_GetCustomValue != 0 then 
    		return CallStdCallWith2Args(pCFrame_GetCustomValue,pCframe,ValueID)
    	endif
    	return 0	
    endfunction
    
    function CFrame_SetCustomValue takes integer pCframe, integer ValueID, integer customval returns nothing
    	if pCFrame_SetCustomValue == 0 then
    		set pCFrame_SetCustomValue = GetModuleProcAddress(EXTRADLLNAME, "CFrame_SetCustomValue")
    	endif
    	if pCFrame_SetCustomValue != 0 then 
    		call CallStdCallWith3Args(pCFrame_SetCustomValue,pCframe,ValueID,customval)
    	endif
    endfunction
    
    function CFrame_LoadFramesListFile takes string filepath, boolean reload returns nothing
    	if pCFrame_LoadFramesListFile == 0 then
    		set pCFrame_LoadFramesListFile = GetModuleProcAddress(EXTRADLLNAME, "CFrame_LoadFramesListFile")
    	endif
    	if pCFrame_LoadFramesListFile != 0 then 
    		call CallStdCallWith2Args(pCFrame_LoadFramesListFile,GetStringAddress(filepath),B2I(reload))
    	endif
    endfunction
    
    function CFrame_CreateNewFrame takes string framename, integer relativeframe, boolean show, integer frameid returns integer
    	if pCFrame_CreateNewFrame == 0 then
    		set pCFrame_CreateNewFrame = GetModuleProcAddress(EXTRADLLNAME, "CFrame_CreateNewFrame")
    	endif
    	if pCFrame_CreateNewFrame != 0 then 
    		return CallStdCallWith4Args(pCFrame_CreateNewFrame,GetStringAddress(framename),relativeframe,B2I(show),frameid)
    	endif
    	return 0
    endfunction
    
    function CFrame_LoadFrame takes string framename, integer frameid returns integer
    	if pCFrame_LoadFrame == 0 then
    		set pCFrame_LoadFrame = GetModuleProcAddress(EXTRADLLNAME, "CFrame_LoadFrame")
    	endif
    	if pCFrame_LoadFrame != 0 then 
    		return CallStdCallWith2Args(pCFrame_LoadFrame,GetStringAddress(framename),frameid)
    	endif
    	return 0
    endfunction
    
    function CFrame_SetFrameType takes integer pCframe, integer frametype returns nothing
    	if pCFrame_SetFrameType == 0 then
    		set pCFrame_SetFrameType = GetModuleProcAddress(EXTRADLLNAME, "CFrame_SetFrameType")
    	endif
    	if pCFrame_SetFrameType != 0 then 
    		call CallStdCallWith2Args(pCFrame_SetFrameType,pCframe,frametype)
    	endif
    endfunction
    
    function CFrame_SetFrameModel takes integer pCframe, string modelpath returns nothing
    	if pCFrame_SetFrameModel == 0 then
    		set pCFrame_SetFrameModel = GetModuleProcAddress(EXTRADLLNAME, "CFrame_SetFrameModel")
    	endif
    	if pCFrame_SetFrameModel != 0 then 
    		call CallStdCallWith2Args(pCFrame_SetFrameModel,pCframe,GetStringAddress(modelpath))
    	endif
    endfunction
    
    function CFrame_SetFrameTexture takes integer pCframe, string texturepath, string borderpath, boolean tiled returns nothing
    	if pCFrame_SetFrameTexture == 0 then
    		set pCFrame_SetFrameTexture = GetModuleProcAddress(EXTRADLLNAME, "CFrame_SetFrameTexture")
    	endif
    	if pCFrame_SetFrameTexture != 0 then 
    		call CallStdCallWith4Args(pCFrame_SetFrameTexture,pCframe,GetStringAddress(texturepath),GetStringAddress(borderpath),B2I(tiled) )
    	endif
    endfunction
    
    function CFrame_SetFrameText takes integer pCframe, string text returns nothing
    	if pCFrame_SetFrameText == 0 then
    		set pCFrame_SetFrameText = GetModuleProcAddress(EXTRADLLNAME, "CFrame_SetFrameText")
    	endif
    	if pCFrame_SetFrameText != 0 then 
    		call CallStdCallWith2Args(pCFrame_SetFrameText,pCframe,GetStringAddress(text))
    	endif
    endfunction
    
    function CFrame_SetAbsolutePosition takes integer pCframe, integer origpos, real AbsoluteX, real AbsoluteY returns nothing
    	if pCFrame_SetAbsolutePosition == 0 then
    		set pCFrame_SetAbsolutePosition = GetModuleProcAddress(EXTRADLLNAME, "CFrame_SetAbsolutePosition")
    	endif
    	if pCFrame_SetAbsolutePosition != 0 then 
    		call CallStdCallWith4Args(pCFrame_SetAbsolutePosition,pCframe,origpos,mR2I(AbsoluteX),mR2I(AbsoluteY))
    	endif
    endfunction
    
    function CFrame_SetRelativePosition takes integer pCframe, integer origpos, integer relativeframeaddr, integer dstpos, real RelativeX, real RelativeY returns nothing
    	if pCFrame_SetRelativePosition == 0 then
    		set pCFrame_SetRelativePosition = GetModuleProcAddress(EXTRADLLNAME, "CFrame_SetRelativePosition")
    	endif
    	if pCFrame_SetRelativePosition != 0 then 
    		call CallStdCallWith6Args(pCFrame_SetRelativePosition,pCframe,origpos,relativeframeaddr,dstpos, mR2I(RelativeX),mR2I(RelativeY))
    	endif
    endfunction
    
    function CFrame_Destroy takes integer pCframe returns nothing
    	if pCFrame_Destroy == 0 then
    		set pCFrame_Destroy = GetModuleProcAddress(EXTRADLLNAME, "CFrame_Destroy")
    	endif
    	if pCFrame_Destroy != 0 then 
    		call CallStdCallWith1Args(pCFrame_Destroy,pCframe)
    	endif
    endfunction
    
    function CFrame_AddCallack takes integer pCframe, string callbackfuncname, integer callbackeventid returns nothing
    	if pCFrame_AddCallack == 0 then
    		set pCFrame_AddCallack = GetModuleProcAddress(EXTRADLLNAME, "CFrame_AddCallack")
    	endif
    	if pCFrame_AddCallack != 0 then 
    		call CallStdCallWith4Args(pCFrame_AddCallack,pCframe,GetStringAddress(callbackfuncname),callbackeventid,0)
    	endif
    endfunction
    
    function CFrame_AddCallackPacket takes integer pCframe, integer framecode, integer callbackeventid returns nothing
    	if pCFrame_AddCallackPacket == 0 then
    		set pCFrame_AddCallackPacket = GetModuleProcAddress(EXTRADLLNAME, "CFrame_AddCallackPacket")
    	endif
    	if pCFrame_AddCallackPacket != 0 then 
    		call CallStdCallWith4Args(pCFrame_AddCallackPacket,pCframe,framecode,callbackeventid,0)
    	endif
    endfunction
    
    function CFrame_Enable takes integer pCframe, boolean enabled returns nothing
    	if pCFrame_Enable == 0 then
    		set pCFrame_Enable = GetModuleProcAddress(EXTRADLLNAME, "CFrame_Enable")
    	endif
    	if pCFrame_Enable != 0 then 
    		call CallStdCallWith2Args(pCFrame_Enable,pCframe,B2I(enabled))
    	endif
    endfunction
    
    
    function CFrame_IsEnabled takes integer pCframe returns boolean
    	if pCFrame_IsEnabled == 0 then
    		set pCFrame_IsEnabled = GetModuleProcAddress(EXTRADLLNAME, "CFrame_IsEnabled")
    	endif
    	if pCFrame_IsEnabled != 0 then 
    		return I2B(CallStdCallWith1Args(pCFrame_IsEnabled,pCframe))
    	endif
    	return false
    endfunction
    
    
    function CFrame_GetFrameAddress takes integer pCframe returns integer
    	if pCFrame_GetFrameAddress == 0 then
    		set pCFrame_GetFrameAddress = GetModuleProcAddress(EXTRADLLNAME, "CFrame_GetFrameAddress")
    	endif
    	if pCFrame_GetFrameAddress != 0 then 
    		return CallStdCallWith1Args(pCFrame_GetFrameAddress,pCframe)
    	endif
    	return 0
    endfunction
    
    function CFrame_StartCustomAnimate takes integer frame,integer anim_id returns nothing
    	if pCFrame_StartCustomAnimate == 0 then
    		set pCFrame_StartCustomAnimate = GetModuleProcAddress(EXTRADLLNAME, "CFrame_StartCustomAnimate")
    	endif
    	if pCFrame_StartCustomAnimate != 0 then 
    		call CallStdCallWith2Args(pCFrame_StartCustomAnimate,pCframe,anim_id)//  0 = anim_id ?
    	endif
    endfunction
    
    function CFrame_StopCustomAnimate takes integer pCframe returns nothing
    	if pCFrame_StopCustomAnimate == 0 then
    		set pCFrame_StopCustomAnimate = GetModuleProcAddress(EXTRADLLNAME, "CFrame_StopCustomAnimate")
    	endif
    	if pCFrame_StopCustomAnimate != 0 then 
    		call CallStdCallWith1Args(pCFrame_StopCustomAnimate,pCframe)
    	endif
    endfunction
    
    function CFrame_SetCustomAnimateOffset takes integer pCframe, real anim_offset returns nothing
    	if pCFrame_SetCustomAnimateOffset == 0 then
    		set pCFrame_SetCustomAnimateOffset = GetModuleProcAddress(EXTRADLLNAME, "CFrame_SetCustomAnimateOffset")
    	endif
    	if pCFrame_SetCustomAnimateOffset != 0 then 
    		call CallStdCallWith2Args(pCFrame_SetCustomAnimateOffset,pCframe,mR2I(anim_offset))
    	endif
    endfunction
    
    function CFrame_SetScale takes integer pCframe, integer backtype, boolean filltoparentframe, real scalex,real scaley returns nothing
    	if pCFrame_SetScale == 0 then
    		set pCFrame_SetScale = GetModuleProcAddress(EXTRADLLNAME, "CFrame_SetScale")
    	endif
    	if pCFrame_SetScale != 0 then 
    		call CallStdCallWith5Args(pCFrame_SetScale,pCframe,backtype, B2I(filltoparentframe),mR2I(scalex),mR2I(scaley) )
    	endif
    endfunction
    
    
    function CFrame_Show takes integer pCframe,boolean show returns nothing
    	if ( pCFrame_Show == 0 ) then
    		set pCFrame_Show = GetModuleProcAddress(EXTRADLLNAME, "CFrame_Show")
    	endif
    	if ( pCFrame_Show != 0 ) then
    		call CallStdCallWith2Args(pCFrame_Show , pCframe , B2I(show))
    	endif
    endfunction
    
    
    function CFrameTestCallback takes nothing returns nothing
    	local integer frameeventid = CFrame_GetLastEventId( )
    	local integer eventframe = CFrame_GetTriggerCFrame( )
    	if eventframe > 0 then 
    		call CFrame_SetFrameText(eventframe,"Clicked " + I2S(testclickcount) + " times.")
    		if frameeventid == FRAME_EVENT_PRESSED then
    		call echo("Clicked " + I2S(testclickcount) + " times.")
    		set testclickcount = testclickcount + 1 
    		endif 
    		call echo("Event id:" + Int2Hex(frameeventid) + ". Frame:" + Int2Hex(eventframe) + ". Flags:" +  Int2Hex( RMem( CFrame_GetFrameAddress(eventframe) + 0x1D4) ))
    	endif
    	
    endfunction
    		
    function CFrameTest takes nothing returns nothing
    	local integer glyphframe = 0
    	call CFrame_LoadFramesListFile("DotaFrameList.txt",true)
    	set glyphframe = CFrame_CreateNewFrame("GlyphButton",RMem(pGameClass2),false,0)
    	call CFrame_SetAbsolutePosition(glyphframe, CFramePosition_BOTTOM_LEFT, 0.155, 0.006  )
    	set glyphframe = CFrame_LoadFrame("GlyphItemButton",0)
    	
    	//call CFrame_AddCallack(glyphframe,"CFrameTestCallback",FRAME_EVENT_PRESSED)
    	//call CFrame_AddCallack(glyphframe,"CFrameTestCallback",FRAME_MOUSE_ENTER)
    	//call CFrame_AddCallack(glyphframe,"CFrameTestCallback",FRAME_MOUSE_LEAVE)
    	//call CFrame_AddCallack(glyphframe,"CFrameTestCallback",FRAME_MOUSE_UP)
    	//call CFrame_AddCallack(glyphframe,"CFrameTestCallback",FRAME_MOUSE_DOWN)
    	//call CFrame_AddCallack(glyphframe,"CFrameTestCallback",FRAME_MOUSE_WHEEL)
    	//call CFrame_AddCallack(glyphframe,"CFrameTestCallback",FRAME_CHECKBOX_CHECKED)
    	//call CFrame_AddCallack(glyphframe,"CFrameTestCallback",FRAME_CHECKBOX_UNCHECKED)
    	//call CFrame_AddCallack(glyphframe,"CFrameTestCallback",FRAME_EDITBOX_TEXT_CHANGED)
    	
    	
    	call CFrame_AddCallackPacket(glyphframe,'GLPH',FRAME_EVENT_PRESSED)
    	call CFrame_AddCallackPacket(glyphframe,'GLPH',FRAME_MOUSE_UP)
    	call CFrame_AddCallackPacket(glyphframe,'GLPH',FRAME_MOUSE_DOWN)
    	call CFrame_AddCallackPacket(glyphframe,'GLPH',FRAME_MOUSE_ENTER)
    	call CFrame_AddCallackPacket(glyphframe,'GLPH',FRAME_MOUSE_LEAVE)
    	
    	
    	call CFrame_SetFrameType(glyphframe,FRAMETYPE_BUTTON)
    	call CFrame_SetFrameText(glyphframe,"Clicked 0 times")
    endfunction
    
    

    #endcode

    Packet API update! (for sync any data)

    globals

    
    		
    	constant integer Packet_RawImageCode = 'IIMG'
    	constant integer Packet_KeyEventCode = 'IKEY'
    	constant integer Packet_CFrameEventCode = 'FRAM'
    
    	integer pPacket_Clear = 0
    	integer pPacket_Initialize = 0
    	integer pPacket_PushInteger = 0
    	integer pPacket_PopInteger = 0
    	integer pPacket_PushReal = 0
    	integer pPacket_PopReal = 0
    	integer pPacket_Send = 0
    	integer pPacket_GetTriggerPlayerId = 0
    
    
    

    endglobals

    code

    
    function Packet_Clear takes nothing returns integer
    	if pPacket_Clear == 0 then
    		set pPacket_Clear = GetModuleProcAddress(EXTRADLLNAME, "Packet_Clear")
    	endif
    	if pPacket_Clear != 0 then
    		return CallStdCallWith1Args(pPacket_Clear,0)
    	endif
    	return 0
    endfunction
    
    function Packet_Initialize takes integer pTriggerHandle returns integer
    	if pPacket_Initialize == 0 then
    		set pPacket_Initialize = GetModuleProcAddress(EXTRADLLNAME, "Packet_Initialize")
    	endif
    	if pPacket_Initialize != 0 then
    		return CallStdCallWith1Args(pPacket_Initialize,pTriggerHandle)
    	endif
    	return 0
    endfunction
    
    function Packet_PushInteger takes integer i returns integer
    	if pPacket_PushInteger == 0 then
    		set pPacket_PushInteger = GetModuleProcAddress(EXTRADLLNAME, "Packet_PushInteger")
    	endif
    	if pPacket_PushInteger != 0 then
    		return CallStdCallWith1Args(pPacket_PushInteger,i)
    	endif
    	return 0
    endfunction
    
    function Packet_PopInteger takes nothing returns integer
    	if pPacket_PopInteger == 0 then
    		set pPacket_PopInteger = GetModuleProcAddress(EXTRADLLNAME, "Packet_PopInteger")
    	endif
    	if pPacket_PopInteger != 0 then
    		return CallStdCallWith1Args(pPacket_PopInteger,0)
    	endif
    	return 0
    endfunction
    
    function Packet_PushReal takes real i returns integer
    	if pPacket_PushReal == 0 then
    		set pPacket_PushReal = GetModuleProcAddress(EXTRADLLNAME, "Packet_PushReal")
    	endif
    	if pPacket_PushReal != 0 then
    		return CallStdCallWith1Args(pPacket_PushReal,mR2I(i))
    	endif
    	return 0
    endfunction
    
    function Packet_PopReal takes nothing returns real
    	local real r = 0.0
    	local integer i = 0
    	if pPacket_PopReal == 0 then
    		set pPacket_PopReal = GetModuleProcAddress(EXTRADLLNAME, "Packet_PopReal")
    	endif
    	if pPacket_PopReal != 0 then
    		return mI2R(CallStdCallWith1Args(pPacket_PopReal,0))
    	endif
    	return r
    endfunction
    
    function Packet_Send takes nothing returns integer
    	if pPacket_Send == 0 then
    		set pPacket_Send = GetModuleProcAddress(EXTRADLLNAME, "Packet_Send")
    	endif
    	if pPacket_Send != 0 then
    		return CallStdCallWith1Args(pPacket_Send,0)
    	endif
    	return 0
    endfunction
    
    function Packet_GetTriggerPlayerId takes nothing returns integer
    	if pPacket_GetTriggerPlayerId == 0 then
    		set pPacket_GetTriggerPlayerId = GetModuleProcAddress(EXTRADLLNAME, "Packet_GetTriggerPlayerId")
    	endif
    	if pPacket_GetTriggerPlayerId != 0 then
    		return CallStdCallWith1Args(pPacket_GetTriggerPlayerId,0)
    	endif
    	return 0
    endfunction
    
    function Packet_TestRecv takes nothing returns nothing 
    	local integer PacketType = Packet_PopInteger( )
    	local integer PacketValueInteger = Packet_PopInteger( )
    	local real PacketValueReal = Packet_PopReal( )
    	local real PacketValueReal2 = Packet_PopReal( )
    	call echo("Packet type:" + Int2Hex(PacketType) + ". Packet integer value:" + I2S(PacketValueInteger) + ". Packet real value:" + R2S(PacketValueReal) + ". Packet real value2:" + R2S(PacketValueReal2) + ". Trigger Player:" + Int2Hex(Packet_GetTriggerPlayerId( )) )
    endfunction
    
    function Packet_TestRecv2 takes nothing returns nothing 
    	local integer PacketType = Packet_PopInteger( )
    	local integer p = Packet_GetTriggerPlayerId( )
    	if (PacketType == Packet_KeyEventCode) then 
    		call echo("Packet_KeyEventCode: Player:" + I2S(p) + ". Player(duplicate):" + I2S(Packet_PopInteger( )) + ". Message:" + I2S(Packet_PopInteger( ))+ ". KeyCode:" + I2S(Packet_PopInteger( )))
    	endif 
    	if (PacketType == Packet_CFrameEventCode) then 
    		call echo("Packet_KeyEventCode: Player:" + I2S(p) + ". Player(duplicate):" + I2S(Packet_PopInteger( )) + ". Frame code:" + I2S(Packet_PopInteger( ))+ ". Event:" + I2S(Packet_PopInteger( )) + ". CTRL:" + I2S(Packet_PopInteger( )) + ". ALT:" + I2S(Packet_PopInteger( )) + ". LEFT MOUSE:" + I2S(Packet_PopInteger( )) + ". RIGHT MOUSE:" + I2S(Packet_PopInteger( )) + ". MIDLE MOUSE:" + I2S(Packet_PopInteger( )))
    	endif 
    	if (PacketType == Packet_RawImageCode) then 
    		call echo("Packet_KeyEventCode: Player:" + I2S(p) + ". Player(duplicate):" + I2S(Packet_PopInteger( )) + ". RawImageId:" + I2S(Packet_PopInteger( ))+ ". EventType:" + I2S(Packet_PopInteger( ))+ ". mouse x/y:" + R2S(Packet_PopReal( )) + "https://github.com/" + R2S(Packet_PopReal( ))+ ". Alt:" + I2S(Packet_PopInteger( ))+ ". Ctrl:" + I2S(Packet_PopInteger( ))+ ". LeftBtn:" + I2S(Packet_PopInteger( ))+ ". EventType:" + I2S(Packet_PopInteger( ))+ ". OffsetX:" + I2S(Packet_PopInteger( ))+ ". OffsetY:" + I2S(Packet_PopInteger( ))+ ". ImageID:" + I2S(Packet_PopInteger( )))
    	endif 
    endfunction
    
    
    function Packet_TestSend takes nothing returns nothing 
    	local integer maxpackets = 20
    	loop 
    	call echo("Packet clear:")
    	call Packet_Clear( )
    	call echo("Packet push packettype(just integer)")
    	call Packet_PushInteger(0x12345678)
    	call echo("Packet push integer")
    	call Packet_PushInteger(maxpackets)
    	call echo("Packet push real")
    	call Packet_PushReal(1234.56)
    	call echo("Packet push real")
    	call Packet_PushReal(1234.56)
    	call echo("Packet send ")
    	call Packet_Send( )
    	call echo("Packet send ok")
    	exitwhen ( maxpackets <= 0 )
    	set maxpackets = maxpackets - 1
    	endloop
    endfunction
    
    function Packet_TestInitialize takes nothing returns nothing
    	// global code
    	local trigger t =CreateTrigger()
    	//call TriggerAddAction(t,function Packet_TestRecv)
    	call TriggerAddAction(t,function Packet_TestRecv2)
    	call Packet_Initialize(GetHandleId(t))
    	set t = null
    	
    	// local send
    	//call Packet_TestSend( )
    	call FuncTriggerRegisterPlayerKeyboardEvent('0')
    	call CFrameTest( )
    endfunction
    
    
    
    

    endcode

    Key codes:

    	 0-Z = 0-Z 
    	 "LBTN" =  Left mouse button
    	 "RBTN" =  Right mouse button
    	 "CANCEL" =  Control-break processing
    	 "MBTN" =  Middle mouse button (three-button mouse)
    	 "XBTN1" =  X1 mouse button
    	 "XBTN2" =  X2 mouse button
    	 "BACK" =  BACKSPACE key
    	 "TAB" =  TAB key
    	 "CLEAR" =  CLEAR key
    	 "RETURN" =  ENTER key
    	 "SHIFT" =  SHIFT key
    	 "CTRL" =  CTRL key
    	 "ALT" =  ALT key
    	 "PAUSE" =  PAUSE key
    	 "CAPS" =  CAPS LOCK key
    	 "KANA" =  IME Kana mode
    	 "VK_HANGUEL" =  IME Hangul mode
    	 "JUNJA" =  IME Junja mode
    	 "FINAL" =  IME final mode
    	 "HANJA" =  IME Hanja mode
    	 "VK_KANJI" =  IME Kanji mode
    	 "ESC" =  ESC key
    	 "CONV" =  IME convert
    	 "NCONV" =  IME nonconvert
    	 "ACCEPT" =  IME accept
    	 "MCHANGE" =  IME mode change request
    	 "SPACE" =  SPACEBAR
    	 "PAGEUP" =  PAGE UP key
    	 "PAGEDN" =  PAGE DOWN key
    	 "END" =  END key
    	 "HOME" =  HOME key
    	 "LEFT" =  LEFT ARROW key
    	 "UP" =  UP ARROW key
    	 "RIGHT" =  RIGHT ARROW key
    	 "DOWN" =  DOWN ARROW key
    	 "SELECT" =  SELECT key
    	 "PRINT" =  PRINT key
    	 "EXEC" =  EXECUTE key
    	 "SSHOT" =  PRINT SCREEN key
    	 "INSERT" =  INS key
    	 "DELETE" =  DEL key
    	 "HELP" =  HELP key
    	 "LWIN" =  Left Windows key (Natural keyboard)
    	 "RWIN" =  Right Windows key (Natural keyboard)
    	 "APPS" =  Applications key (Natural keyboard)
    	 "SLEEP" =  Computer Sleep key
    	 "NPAD0" =  Numeric keypad 0 key
    	 "NPAD1" =  Numeric keypad 1 key
    	 "NPAD2" =  Numeric keypad 2 key
    	 "NPAD3" =  Numeric keypad 3 key
    	 "NPAD4" =  Numeric keypad 4 key
    	 "NPAD5" =  Numeric keypad 5 key
    	 "NPAD6" =  Numeric keypad 6 key
    	 "NPAD7" =  Numeric keypad 7 key
    	 "NPAD8" =  Numeric keypad 8 key
    	 "NPAD9" =  Numeric keypad 9 key
    	 "MULT" =  Multiply key
    	 "ADD" =  Add key
    	 "SEP" =  Separator key
    	 "SUB" =  Subtract key
    	 "DEC" =  Decimal key
    	 "DIV" =  Divide key
    	 "F1" =  F1 key
    	 "F2" =  F2 key
    	 "F3" =  F3 key
    	 "F4" =  F4 key
    	 "F5" =  F5 key
    	 "F6" =  F6 key
    	 "F7" =  F7 key
    	 "F8" =  F8 key
    	 "F9" =  F9 key
    	 "F10" =  F10 key
    	 "F11" =  F11 key
    	 "F12" =  F12 key
    	 "F13" =  F13 key
    	 "F14" =  F14 key
    	 "F15" =  F15 key
    	 "F16" =  F16 key
    	 "F17" =  F17 key
    	 "F18" =  F18 key
    	 "F19" =  F19 key
    	 "F20" =  F20 key
    	 "F21" =  F21 key
    	 "F22" =  F22 key
    	 "F23" =  F23 key
    	 "F24" =  F24 key
    	 "NLOCK" =  NUM LOCK key
    	 "SCRL" =  SCROLL LOCK key
    	 "LSHFT" =  Left SHIFT key
    	 "RSHFT" =  Right SHIFT key
    	 "LCTRL" =  Left CONTROL key
    	 "RCTRL" =  Right CONTROL key
    	 "LALT" =  Left MENU key
    	 "RALT" =  Right MENU key
    	 "BBACK" =  Browser Back key
    	 "BFORW" =  Browser Forward key
    	 "BREFR" =  Browser Refresh key
    	 "BSTOP" =  Browser Stop key
    	 "BSEARCH" =  Browser Search key
    	 "BFAV" =  Browser Favorites key
    	 "BHOME" =  Browser Start and Home key
    	 "MUTE" =  Volume Mute key
    	 "V_DOWN" =  Volume Down key
    	 "V_UP" =  Volume Up key
    	 "NEXT" =  Next Track key
    	 "PREV" =  Previous Track key
    	 "STOP" =  Stop Media key
    	 "MPLAY" =  Play/Pause Media key
    	 "MAIL" =  Start Mail key
    	 "MSEL" =  Select Media key
    	 "APP1" =  Start Application 1 key
    	 "APP2" =  Start Application 2 key
    	 "OEM_1" =  Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ';:' key
    	 "OEM_P" =  For any country/region, the '+' key
    	 "COMMA" =  For any country/region, the ',' key
    	 "MINUS" =  For any country/region, the '-' key
    	 "PERIOD" =  For any country/region, the '.' key
    	 "OEM_2" =  Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '/?' key
    	 "OEM_3" =  Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '`~' key
    	 "ABNT_C1" =  Brazilian (ABNT) Keyboard
    	 "ABNT_C2" =  Brazilian (ABNT) Keyboard
    	 "OEM_4" =  Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '[{' key
    	 "OEM_5" =  Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '\|' key
    	 "OEM_6" =  Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ']}' key
    	 "OEM_7" =  Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the 'single-quote/double-quote' key
    	 "OEM_8" =  Used for miscellaneous characters; it can vary by keyboard.
    	 "OEM102" =  Either the angle bracket key or the backslash key on the RT 102-key keyboard
    	 "PROCKEY" =  IME PROCESS key
    	 "PACKET" =  Used to pass Unicode characters as if they were keystrokes.
    	 "ATTN" =  Attn key
    	 "CRSEL" =  CrSel key
    	 "EXSEL" =  ExSel key
    	 "EREOF" =  Erase EOF key
    	 "PLAY" =  Play key
    	 "ZOOM" =  Zoom key
    	 "NONAME" =  Reserved
    	 "PA1" =  PA1 key
    	 "OCLEAR" =  Clear key
    
    // ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строку Π² ΠΊΠΎΠ΄ клавиши (ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ клавиш)
    int __stdcall ConvertKeyStringToKeyCode( const char * str )
    // ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ клавиши Π² строку
    const char * __stdcall ConvertKeyCodeToKeyString( unsigned int code )
    
    Visit original content creator repository https://github.com/UnrealKaraulov/WarcraftIII_DLL_126-xxx
  • WarcraftIII_DLL_126-xxx

    WarcraftIII_DLL_126-127

    Improvements for Warcraft III 126a and 127a, used in new DoTA (d1stats.ru)

    Features:

    “Attack Speed” and “Magic amplification” More unit info

    “Move Speed” and “Magic Protection” More unit info

    “Widescreen support”

    (Widescreen support disabled:)

    Widescreen off

    (Widescreen support enabled:)

    Widescreen on

    “Ally skill view” Ally skill viewer

    “Ally manabar view” Ally manabar viewer

    RawImage update:

    // Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ RawImage (RGBA) с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ
    // Create RawImage with color
    int __stdcall CreateRawImage( int width, int height, RGBAPix defaultcolor )
    // Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ RawImage ΠΈΠ· filename (tga,blp)
    // Load RawImage from game file
    int __stdcall LoadRawImage( const char * filename )
    // РисуСт RawImage2 Π½Π° RawImage
    // Draw RawImage2 at RawImage
    int __stdcall RawImage_DrawImg( int RawImage, int RawImage2, int drawx, int drawy, int blendmode )
    // ЗаполняСт Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ пиксСль ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ
    // Fill pixel with color
    int __stdcall RawImage_DrawPixel( int RawImage, int x, int y, RGBAPix color )//RGBAPix = unsigned int
    // РисуСт ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ
    // Fill rectangle with color
    int __stdcall RawImage_DrawRect( int RawImage, int drawx, int drawy, int widthsize, int heightsize, RGBAPix color )
    // РисуСт линию с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ
    // Draw line with color
    int __stdcall RawImage_DrawLine( int RawImage, int x1, int y1, int x2, int y2, int size, RGBAPix color )
    // РисуСт ΠΊΡ€ΡƒΠ³ с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ радиусом, Ρ‚ΠΎΠ»Ρ‰ΠΈΠ½ΠΎΠΉ, Ρ†Π²Π΅Ρ‚ΠΎΠΌ
    // Draw circle with color
    int __stdcall RawImage_DrawCircle( int RawImage, int x, int y, int radius, int size, RGBAPix color )
    // ЗаполняСт ΠΊΡ€ΡƒΠ³ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ
    // Fill circle with color
    int __stdcall RawImage_FillCircle( int RawImage, int x, int y, int radius, RGBAPix color )
    // ΠžΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΡ€ΡƒΠ³ с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ радиусом
    // Erase circle
    int __stdcall RawImage_EraseCircle( int RawImage, int x, int y, int radius, BOOL inverse )
    // Π”Π΅Π»Π°Π΅Ρ‚ пиксСли с Ρ†Π²Π΅Ρ‚ΠΎΠΌ color - ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌΠΈ, power ΠΎΡ‚ 0 Π΄ΠΎ 255
    // Not working
    int __stdcall RawImage_EraseColor( int RawImage, RGBAPix color, int power )
    // Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΡˆΡ€ΠΈΡ„Ρ‚ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°
    // Load font from game file
    int __stdcall RawImage_LoadFontFromResource( const char * filepath )
    // УстанавливаСт настройки ΡˆΡ€ΠΈΡ„Ρ‚Π° для RawImage_DrawText
    // Set font settings for DrawText
    int __stdcall RawImage_SetFontSettings( const char * fontname, int fontsize, unsigned int flags )
    // ΠŸΠΈΡˆΠ΅Ρ‚ тСкст Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°Ρ… с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ Ρ†Π²Π΅Ρ‚ΠΎΠΌ ΠΈ настройками ΡˆΡ€ΠΈΡ„Ρ‚Π° RawImage_SetFontSettings
    // Draw text at RawImage
    int __stdcall RawImage_DrawText( int RawImage, const char * text, int x, int y, RGBAPix color )
    // БохраняСт RawImage Π² blp ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ доступным для использования Π² ΠΈΠ³Ρ€Π΅
    // Save RawImage to game file
    int __stdcall SaveRawImageToGameFile( int RawImage, const char * filename, BOOL IsTga, BOOL enabled )
    // БохраняСт RawImage Π½Π° диск Π² TGA ΠΏΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ
    // Save RawIamge to file
    int __stdcall DumpRawImageToFile( int RawImage, const char * filename )
    // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ RawImage ΠΈΠ· списка RawImages ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°.
    // Search RawImage by filename
    int __stdcall GetRawImageByFile( const char * filename )
    // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡˆΠΈΡ€ΠΈΠ½Ρƒ RawImage
    // Get width
    int __stdcall RawImage_GetWidth( int RawImage )
    // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ высоту RawImage
    // Get height
    int __stdcall RawImage_GetHeight( int RawImage )
    // Π˜Π·ΠΌΠ΅Π½ΡΠ΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ RawImage
    // Resize RawImage
    int __stdcall RawImage_Resize( int RawImage, int newwidth, int newheight )
    // РисуСт RawImage ΠΏΠΎ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌ (ΠΎΡ‚ 0.0 Π΄ΠΎ 1.0) Π² ΠΈΠ³Ρ€Π΅. МоТно ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ (ΠΎΡ‚ 0.0 Π΄ΠΎ 1.0).
    // Draw RawImage as overlay ingame. xsize / ysize not working in this version (use 0.0)
    int __stdcall RawImage_DrawOverlay( int RawImage, BOOL enabled, float xpos, float ypos, float xsize, float ysize )
    int __stdcall RawImage_EnableOverlay( unsigned int RawImage, BOOL enabled )
    int __stdcall RawImage_MoveTimed( unsigned int RawImage, float x2, float y2, unsigned int Time1, unsigned int Time2, unsigned int SleepTime )
    int __stdcall RawImage_SetPacketCallback( unsigned int RawImage, BOOL enable, unsigned int events )
    int __stdcall RawImage_AddCallback( unsigned int RawImage, const char * MouseActionCallback, RawImageCallbackData * callbackdata, unsigned int events )
    int __stdcall RawImage_IsBtn( unsigned int RawImage, BOOL enabled )
    

    “Example result:” RawImage Draw API

    CFrame API update:

    globals

    	integer testclickcount = 0
    
    
    	integer pCFrame_GetLastEventId = 0 
    	integer pCFrame_GetTriggerCFrame = 0
    	integer pCFrame_SetCustomValue = 0
    	integer pCFrame_GetCustomValue = 0
    	integer pCFrame_LoadFramesListFile = 0 
    	integer pCFrame_CreateNewFrame = 0 
    	integer pCFrame_LoadFrame = 0 
    	integer pCFrame_SetFrameType = 0 
    	integer pCFrame_SetFrameModel = 0 
    	integer pCFrame_SetFrameTexture = 0 
    	integer pCFrame_SetFrameText = 0 
    	integer pCFrame_SetAbsolutePosition = 0 
    	integer pCFrame_SetRelativePosition = 0 
    	integer pCFrame_Destroy = 0 
    	integer pCFrame_AddCallack = 0 
    	integer pCFrame_AddCallackPacket = 0 
    	integer pCFrame_Enable = 0
    	integer pCFrame_IsEnabled = 0
    	integer pCFrame_GetFrameAddress = 0
    	integer pCFrame_StartCustomAnimate = 0
    	integer	pCFrame_SetCustomAnimateOffset = 0
    	integer	pCFrame_StopCustomAnimate = 0
    	integer pCFrame_SetScale = 0
    	integer pCFrame_Show = 0
    	
    	integer CFrameBackType_ControlFrame = 0
    	integer CFrameBackType_ControlBackdrop = 1
    	integer CFrameBackType_ControlPushedBackdrop = 2
    	integer CFrameBackType_ControlDisabledBackdrop = 3
    
    	integer	CFramePosition_TOP_LEFT = 0
    	integer	CFramePosition_TOP_CENTER = 1
    	integer	CFramePosition_TOP_RIGHT = 2
    	integer	CFramePosition_LEFT = 3
    	integer	CFramePosition_CENTER = 4
    	integer	CFramePosition_RIGHT = 5
    	integer	CFramePosition_BOTTOM_LEFT = 6
    	integer	CFramePosition_BOTTOM_CENTER = 7
    	integer	CFramePosition_BOTTOM_RIGHT = 8
    
    	integer	FRAMETYPE_FRAME = 0
    	integer	FRAMETYPE_BACKDROP = 1
    	integer	FRAMETYPE_ITEM = 2
    	integer	FRAMETYPE_POPUPMENU = 3
    	integer	FRAMETYPE_EDITBOX = 4
    	integer	FRAMETYPE_BUTTON = 5
    	integer	FRAMETYPE_TEXTBUTTON = 6
    	integer	FRAMETYPE_SPRITE = 7
    	integer	FRAMETYPE_HIGHLIGHT = 8
    	integer	FRAMETYPE_SCROLLBAR = 9
    	integer	FRAMETYPE_MODEL = 10
    
    	integer FRAME_EVENT_PRESSED = 1
    	integer FRAME_MOUSE_ENTER = 2
    	integer FRAME_MOUSE_LEAVE = 3
    	integer FRAME_MOUSE_UP = 4
    	integer FRAME_MOUSE_DOWN = 5
    	integer FRAME_MOUSE_WHEEL = 6
    	integer FRAME_FOCUS_ENTER = FRAME_MOUSE_ENTER
    	integer FRAME_FOCUS_LEAVE = FRAME_MOUSE_LEAVE
    	integer FRAME_CHECKBOX_CHECKED = 7
    	integer FRAME_CHECKBOX_UNCHECKED = 8
    	integer FRAME_EDITBOX_TEXT_CHANGED = 9
    	integer FRAME_POPUPMENU_ITEM_CHANGE_START = 10
    	integer FRAME_POPUPMENU_ITEM_CHANGED = 11
    	integer FRAME_MOUSE_DOUBLECLICK = 12
    	integer FRAME_SPRITE_ANIM_UPDATE = 13
    	
    

    #endglobals

    #code

    
    
    function CFrame_GetLastEventId takes nothing returns integer
    	if pCFrame_GetLastEventId == 0 then
    		set pCFrame_GetLastEventId = GetModuleProcAddress(EXTRADLLNAME, "CFrame_GetLastEventId")
    	endif
    	if pCFrame_GetLastEventId != 0 then 
    		return CallStdCallWith1Args(pCFrame_GetLastEventId,0)
    	endif
    	return 0
    endfunction
    
    function CFrame_GetTriggerCFrame takes nothing returns integer
    	if pCFrame_GetTriggerCFrame == 0 then
    		set pCFrame_GetTriggerCFrame = GetModuleProcAddress(EXTRADLLNAME, "CFrame_GetTriggerCFrame")
    	endif
    	if pCFrame_GetTriggerCFrame != 0 then 
    		return CallStdCallWith1Args(pCFrame_GetTriggerCFrame,0)
    	endif
    	return 0
    endfunction
    
    function CFrame_GetCustomValue takes integer pCframe, integer ValueID returns integer
    	if pCFrame_GetCustomValue == 0 then
    		set pCFrame_GetCustomValue = GetModuleProcAddress(EXTRADLLNAME, "CFrame_GetCustomValue")
    	endif
    	if pCFrame_GetCustomValue != 0 then 
    		return CallStdCallWith2Args(pCFrame_GetCustomValue,pCframe,ValueID)
    	endif
    	return 0	
    endfunction
    
    function CFrame_SetCustomValue takes integer pCframe, integer ValueID, integer customval returns nothing
    	if pCFrame_SetCustomValue == 0 then
    		set pCFrame_SetCustomValue = GetModuleProcAddress(EXTRADLLNAME, "CFrame_SetCustomValue")
    	endif
    	if pCFrame_SetCustomValue != 0 then 
    		call CallStdCallWith3Args(pCFrame_SetCustomValue,pCframe,ValueID,customval)
    	endif
    endfunction
    
    function CFrame_LoadFramesListFile takes string filepath, boolean reload returns nothing
    	if pCFrame_LoadFramesListFile == 0 then
    		set pCFrame_LoadFramesListFile = GetModuleProcAddress(EXTRADLLNAME, "CFrame_LoadFramesListFile")
    	endif
    	if pCFrame_LoadFramesListFile != 0 then 
    		call CallStdCallWith2Args(pCFrame_LoadFramesListFile,GetStringAddress(filepath),B2I(reload))
    	endif
    endfunction
    
    function CFrame_CreateNewFrame takes string framename, integer relativeframe, boolean show, integer frameid returns integer
    	if pCFrame_CreateNewFrame == 0 then
    		set pCFrame_CreateNewFrame = GetModuleProcAddress(EXTRADLLNAME, "CFrame_CreateNewFrame")
    	endif
    	if pCFrame_CreateNewFrame != 0 then 
    		return CallStdCallWith4Args(pCFrame_CreateNewFrame,GetStringAddress(framename),relativeframe,B2I(show),frameid)
    	endif
    	return 0
    endfunction
    
    function CFrame_LoadFrame takes string framename, integer frameid returns integer
    	if pCFrame_LoadFrame == 0 then
    		set pCFrame_LoadFrame = GetModuleProcAddress(EXTRADLLNAME, "CFrame_LoadFrame")
    	endif
    	if pCFrame_LoadFrame != 0 then 
    		return CallStdCallWith2Args(pCFrame_LoadFrame,GetStringAddress(framename),frameid)
    	endif
    	return 0
    endfunction
    
    function CFrame_SetFrameType takes integer pCframe, integer frametype returns nothing
    	if pCFrame_SetFrameType == 0 then
    		set pCFrame_SetFrameType = GetModuleProcAddress(EXTRADLLNAME, "CFrame_SetFrameType")
    	endif
    	if pCFrame_SetFrameType != 0 then 
    		call CallStdCallWith2Args(pCFrame_SetFrameType,pCframe,frametype)
    	endif
    endfunction
    
    function CFrame_SetFrameModel takes integer pCframe, string modelpath returns nothing
    	if pCFrame_SetFrameModel == 0 then
    		set pCFrame_SetFrameModel = GetModuleProcAddress(EXTRADLLNAME, "CFrame_SetFrameModel")
    	endif
    	if pCFrame_SetFrameModel != 0 then 
    		call CallStdCallWith2Args(pCFrame_SetFrameModel,pCframe,GetStringAddress(modelpath))
    	endif
    endfunction
    
    function CFrame_SetFrameTexture takes integer pCframe, string texturepath, string borderpath, boolean tiled returns nothing
    	if pCFrame_SetFrameTexture == 0 then
    		set pCFrame_SetFrameTexture = GetModuleProcAddress(EXTRADLLNAME, "CFrame_SetFrameTexture")
    	endif
    	if pCFrame_SetFrameTexture != 0 then 
    		call CallStdCallWith4Args(pCFrame_SetFrameTexture,pCframe,GetStringAddress(texturepath),GetStringAddress(borderpath),B2I(tiled) )
    	endif
    endfunction
    
    function CFrame_SetFrameText takes integer pCframe, string text returns nothing
    	if pCFrame_SetFrameText == 0 then
    		set pCFrame_SetFrameText = GetModuleProcAddress(EXTRADLLNAME, "CFrame_SetFrameText")
    	endif
    	if pCFrame_SetFrameText != 0 then 
    		call CallStdCallWith2Args(pCFrame_SetFrameText,pCframe,GetStringAddress(text))
    	endif
    endfunction
    
    function CFrame_SetAbsolutePosition takes integer pCframe, integer origpos, real AbsoluteX, real AbsoluteY returns nothing
    	if pCFrame_SetAbsolutePosition == 0 then
    		set pCFrame_SetAbsolutePosition = GetModuleProcAddress(EXTRADLLNAME, "CFrame_SetAbsolutePosition")
    	endif
    	if pCFrame_SetAbsolutePosition != 0 then 
    		call CallStdCallWith4Args(pCFrame_SetAbsolutePosition,pCframe,origpos,mR2I(AbsoluteX),mR2I(AbsoluteY))
    	endif
    endfunction
    
    function CFrame_SetRelativePosition takes integer pCframe, integer origpos, integer relativeframeaddr, integer dstpos, real RelativeX, real RelativeY returns nothing
    	if pCFrame_SetRelativePosition == 0 then
    		set pCFrame_SetRelativePosition = GetModuleProcAddress(EXTRADLLNAME, "CFrame_SetRelativePosition")
    	endif
    	if pCFrame_SetRelativePosition != 0 then 
    		call CallStdCallWith6Args(pCFrame_SetRelativePosition,pCframe,origpos,relativeframeaddr,dstpos, mR2I(RelativeX),mR2I(RelativeY))
    	endif
    endfunction
    
    function CFrame_Destroy takes integer pCframe returns nothing
    	if pCFrame_Destroy == 0 then
    		set pCFrame_Destroy = GetModuleProcAddress(EXTRADLLNAME, "CFrame_Destroy")
    	endif
    	if pCFrame_Destroy != 0 then 
    		call CallStdCallWith1Args(pCFrame_Destroy,pCframe)
    	endif
    endfunction
    
    function CFrame_AddCallack takes integer pCframe, string callbackfuncname, integer callbackeventid returns nothing
    	if pCFrame_AddCallack == 0 then
    		set pCFrame_AddCallack = GetModuleProcAddress(EXTRADLLNAME, "CFrame_AddCallack")
    	endif
    	if pCFrame_AddCallack != 0 then 
    		call CallStdCallWith4Args(pCFrame_AddCallack,pCframe,GetStringAddress(callbackfuncname),callbackeventid,0)
    	endif
    endfunction
    
    function CFrame_AddCallackPacket takes integer pCframe, integer framecode, integer callbackeventid returns nothing
    	if pCFrame_AddCallackPacket == 0 then
    		set pCFrame_AddCallackPacket = GetModuleProcAddress(EXTRADLLNAME, "CFrame_AddCallackPacket")
    	endif
    	if pCFrame_AddCallackPacket != 0 then 
    		call CallStdCallWith4Args(pCFrame_AddCallackPacket,pCframe,framecode,callbackeventid,0)
    	endif
    endfunction
    
    function CFrame_Enable takes integer pCframe, boolean enabled returns nothing
    	if pCFrame_Enable == 0 then
    		set pCFrame_Enable = GetModuleProcAddress(EXTRADLLNAME, "CFrame_Enable")
    	endif
    	if pCFrame_Enable != 0 then 
    		call CallStdCallWith2Args(pCFrame_Enable,pCframe,B2I(enabled))
    	endif
    endfunction
    
    
    function CFrame_IsEnabled takes integer pCframe returns boolean
    	if pCFrame_IsEnabled == 0 then
    		set pCFrame_IsEnabled = GetModuleProcAddress(EXTRADLLNAME, "CFrame_IsEnabled")
    	endif
    	if pCFrame_IsEnabled != 0 then 
    		return I2B(CallStdCallWith1Args(pCFrame_IsEnabled,pCframe))
    	endif
    	return false
    endfunction
    
    
    function CFrame_GetFrameAddress takes integer pCframe returns integer
    	if pCFrame_GetFrameAddress == 0 then
    		set pCFrame_GetFrameAddress = GetModuleProcAddress(EXTRADLLNAME, "CFrame_GetFrameAddress")
    	endif
    	if pCFrame_GetFrameAddress != 0 then 
    		return CallStdCallWith1Args(pCFrame_GetFrameAddress,pCframe)
    	endif
    	return 0
    endfunction
    
    function CFrame_StartCustomAnimate takes integer frame,integer anim_id returns nothing
    	if pCFrame_StartCustomAnimate == 0 then
    		set pCFrame_StartCustomAnimate = GetModuleProcAddress(EXTRADLLNAME, "CFrame_StartCustomAnimate")
    	endif
    	if pCFrame_StartCustomAnimate != 0 then 
    		call CallStdCallWith2Args(pCFrame_StartCustomAnimate,pCframe,anim_id)//  0 = anim_id ?
    	endif
    endfunction
    
    function CFrame_StopCustomAnimate takes integer pCframe returns nothing
    	if pCFrame_StopCustomAnimate == 0 then
    		set pCFrame_StopCustomAnimate = GetModuleProcAddress(EXTRADLLNAME, "CFrame_StopCustomAnimate")
    	endif
    	if pCFrame_StopCustomAnimate != 0 then 
    		call CallStdCallWith1Args(pCFrame_StopCustomAnimate,pCframe)
    	endif
    endfunction
    
    function CFrame_SetCustomAnimateOffset takes integer pCframe, real anim_offset returns nothing
    	if pCFrame_SetCustomAnimateOffset == 0 then
    		set pCFrame_SetCustomAnimateOffset = GetModuleProcAddress(EXTRADLLNAME, "CFrame_SetCustomAnimateOffset")
    	endif
    	if pCFrame_SetCustomAnimateOffset != 0 then 
    		call CallStdCallWith2Args(pCFrame_SetCustomAnimateOffset,pCframe,mR2I(anim_offset))
    	endif
    endfunction
    
    function CFrame_SetScale takes integer pCframe, integer backtype, boolean filltoparentframe, real scalex,real scaley returns nothing
    	if pCFrame_SetScale == 0 then
    		set pCFrame_SetScale = GetModuleProcAddress(EXTRADLLNAME, "CFrame_SetScale")
    	endif
    	if pCFrame_SetScale != 0 then 
    		call CallStdCallWith5Args(pCFrame_SetScale,pCframe,backtype, B2I(filltoparentframe),mR2I(scalex),mR2I(scaley) )
    	endif
    endfunction
    
    
    function CFrame_Show takes integer pCframe,boolean show returns nothing
    	if ( pCFrame_Show == 0 ) then
    		set pCFrame_Show = GetModuleProcAddress(EXTRADLLNAME, "CFrame_Show")
    	endif
    	if ( pCFrame_Show != 0 ) then
    		call CallStdCallWith2Args(pCFrame_Show , pCframe , B2I(show))
    	endif
    endfunction
    
    
    function CFrameTestCallback takes nothing returns nothing
    	local integer frameeventid = CFrame_GetLastEventId( )
    	local integer eventframe = CFrame_GetTriggerCFrame( )
    	if eventframe > 0 then 
    		call CFrame_SetFrameText(eventframe,"Clicked " + I2S(testclickcount) + " times.")
    		if frameeventid == FRAME_EVENT_PRESSED then
    		call echo("Clicked " + I2S(testclickcount) + " times.")
    		set testclickcount = testclickcount + 1 
    		endif 
    		call echo("Event id:" + Int2Hex(frameeventid) + ". Frame:" + Int2Hex(eventframe) + ". Flags:" +  Int2Hex( RMem( CFrame_GetFrameAddress(eventframe) + 0x1D4) ))
    	endif
    	
    endfunction
    		
    function CFrameTest takes nothing returns nothing
    	local integer glyphframe = 0
    	call CFrame_LoadFramesListFile("DotaFrameList.txt",true)
    	set glyphframe = CFrame_CreateNewFrame("GlyphButton",RMem(pGameClass2),false,0)
    	call CFrame_SetAbsolutePosition(glyphframe, CFramePosition_BOTTOM_LEFT, 0.155, 0.006  )
    	set glyphframe = CFrame_LoadFrame("GlyphItemButton",0)
    	
    	//call CFrame_AddCallack(glyphframe,"CFrameTestCallback",FRAME_EVENT_PRESSED)
    	//call CFrame_AddCallack(glyphframe,"CFrameTestCallback",FRAME_MOUSE_ENTER)
    	//call CFrame_AddCallack(glyphframe,"CFrameTestCallback",FRAME_MOUSE_LEAVE)
    	//call CFrame_AddCallack(glyphframe,"CFrameTestCallback",FRAME_MOUSE_UP)
    	//call CFrame_AddCallack(glyphframe,"CFrameTestCallback",FRAME_MOUSE_DOWN)
    	//call CFrame_AddCallack(glyphframe,"CFrameTestCallback",FRAME_MOUSE_WHEEL)
    	//call CFrame_AddCallack(glyphframe,"CFrameTestCallback",FRAME_CHECKBOX_CHECKED)
    	//call CFrame_AddCallack(glyphframe,"CFrameTestCallback",FRAME_CHECKBOX_UNCHECKED)
    	//call CFrame_AddCallack(glyphframe,"CFrameTestCallback",FRAME_EDITBOX_TEXT_CHANGED)
    	
    	
    	call CFrame_AddCallackPacket(glyphframe,'GLPH',FRAME_EVENT_PRESSED)
    	call CFrame_AddCallackPacket(glyphframe,'GLPH',FRAME_MOUSE_UP)
    	call CFrame_AddCallackPacket(glyphframe,'GLPH',FRAME_MOUSE_DOWN)
    	call CFrame_AddCallackPacket(glyphframe,'GLPH',FRAME_MOUSE_ENTER)
    	call CFrame_AddCallackPacket(glyphframe,'GLPH',FRAME_MOUSE_LEAVE)
    	
    	
    	call CFrame_SetFrameType(glyphframe,FRAMETYPE_BUTTON)
    	call CFrame_SetFrameText(glyphframe,"Clicked 0 times")
    endfunction
    
    

    #endcode

    Packet API update! (for sync any data)

    globals

    
    		
    	constant integer Packet_RawImageCode = 'IIMG'
    	constant integer Packet_KeyEventCode = 'IKEY'
    	constant integer Packet_CFrameEventCode = 'FRAM'
    
    	integer pPacket_Clear = 0
    	integer pPacket_Initialize = 0
    	integer pPacket_PushInteger = 0
    	integer pPacket_PopInteger = 0
    	integer pPacket_PushReal = 0
    	integer pPacket_PopReal = 0
    	integer pPacket_Send = 0
    	integer pPacket_GetTriggerPlayerId = 0
    
    
    

    endglobals

    code

    
    function Packet_Clear takes nothing returns integer
    	if pPacket_Clear == 0 then
    		set pPacket_Clear = GetModuleProcAddress(EXTRADLLNAME, "Packet_Clear")
    	endif
    	if pPacket_Clear != 0 then
    		return CallStdCallWith1Args(pPacket_Clear,0)
    	endif
    	return 0
    endfunction
    
    function Packet_Initialize takes integer pTriggerHandle returns integer
    	if pPacket_Initialize == 0 then
    		set pPacket_Initialize = GetModuleProcAddress(EXTRADLLNAME, "Packet_Initialize")
    	endif
    	if pPacket_Initialize != 0 then
    		return CallStdCallWith1Args(pPacket_Initialize,pTriggerHandle)
    	endif
    	return 0
    endfunction
    
    function Packet_PushInteger takes integer i returns integer
    	if pPacket_PushInteger == 0 then
    		set pPacket_PushInteger = GetModuleProcAddress(EXTRADLLNAME, "Packet_PushInteger")
    	endif
    	if pPacket_PushInteger != 0 then
    		return CallStdCallWith1Args(pPacket_PushInteger,i)
    	endif
    	return 0
    endfunction
    
    function Packet_PopInteger takes nothing returns integer
    	if pPacket_PopInteger == 0 then
    		set pPacket_PopInteger = GetModuleProcAddress(EXTRADLLNAME, "Packet_PopInteger")
    	endif
    	if pPacket_PopInteger != 0 then
    		return CallStdCallWith1Args(pPacket_PopInteger,0)
    	endif
    	return 0
    endfunction
    
    function Packet_PushReal takes real i returns integer
    	if pPacket_PushReal == 0 then
    		set pPacket_PushReal = GetModuleProcAddress(EXTRADLLNAME, "Packet_PushReal")
    	endif
    	if pPacket_PushReal != 0 then
    		return CallStdCallWith1Args(pPacket_PushReal,mR2I(i))
    	endif
    	return 0
    endfunction
    
    function Packet_PopReal takes nothing returns real
    	local real r = 0.0
    	local integer i = 0
    	if pPacket_PopReal == 0 then
    		set pPacket_PopReal = GetModuleProcAddress(EXTRADLLNAME, "Packet_PopReal")
    	endif
    	if pPacket_PopReal != 0 then
    		return mI2R(CallStdCallWith1Args(pPacket_PopReal,0))
    	endif
    	return r
    endfunction
    
    function Packet_Send takes nothing returns integer
    	if pPacket_Send == 0 then
    		set pPacket_Send = GetModuleProcAddress(EXTRADLLNAME, "Packet_Send")
    	endif
    	if pPacket_Send != 0 then
    		return CallStdCallWith1Args(pPacket_Send,0)
    	endif
    	return 0
    endfunction
    
    function Packet_GetTriggerPlayerId takes nothing returns integer
    	if pPacket_GetTriggerPlayerId == 0 then
    		set pPacket_GetTriggerPlayerId = GetModuleProcAddress(EXTRADLLNAME, "Packet_GetTriggerPlayerId")
    	endif
    	if pPacket_GetTriggerPlayerId != 0 then
    		return CallStdCallWith1Args(pPacket_GetTriggerPlayerId,0)
    	endif
    	return 0
    endfunction
    
    function Packet_TestRecv takes nothing returns nothing 
    	local integer PacketType = Packet_PopInteger( )
    	local integer PacketValueInteger = Packet_PopInteger( )
    	local real PacketValueReal = Packet_PopReal( )
    	local real PacketValueReal2 = Packet_PopReal( )
    	call echo("Packet type:" + Int2Hex(PacketType) + ". Packet integer value:" + I2S(PacketValueInteger) + ". Packet real value:" + R2S(PacketValueReal) + ". Packet real value2:" + R2S(PacketValueReal2) + ". Trigger Player:" + Int2Hex(Packet_GetTriggerPlayerId( )) )
    endfunction
    
    function Packet_TestRecv2 takes nothing returns nothing 
    	local integer PacketType = Packet_PopInteger( )
    	local integer p = Packet_GetTriggerPlayerId( )
    	if (PacketType == Packet_KeyEventCode) then 
    		call echo("Packet_KeyEventCode: Player:" + I2S(p) + ". Player(duplicate):" + I2S(Packet_PopInteger( )) + ". Message:" + I2S(Packet_PopInteger( ))+ ". KeyCode:" + I2S(Packet_PopInteger( )))
    	endif 
    	if (PacketType == Packet_CFrameEventCode) then 
    		call echo("Packet_KeyEventCode: Player:" + I2S(p) + ". Player(duplicate):" + I2S(Packet_PopInteger( )) + ". Frame code:" + I2S(Packet_PopInteger( ))+ ". Event:" + I2S(Packet_PopInteger( )) + ". CTRL:" + I2S(Packet_PopInteger( )) + ". ALT:" + I2S(Packet_PopInteger( )) + ". LEFT MOUSE:" + I2S(Packet_PopInteger( )) + ". RIGHT MOUSE:" + I2S(Packet_PopInteger( )) + ". MIDLE MOUSE:" + I2S(Packet_PopInteger( )))
    	endif 
    	if (PacketType == Packet_RawImageCode) then 
    		call echo("Packet_KeyEventCode: Player:" + I2S(p) + ". Player(duplicate):" + I2S(Packet_PopInteger( )) + ". RawImageId:" + I2S(Packet_PopInteger( ))+ ". EventType:" + I2S(Packet_PopInteger( ))+ ". mouse x/y:" + R2S(Packet_PopReal( )) + "https://github.com/" + R2S(Packet_PopReal( ))+ ". Alt:" + I2S(Packet_PopInteger( ))+ ". Ctrl:" + I2S(Packet_PopInteger( ))+ ". LeftBtn:" + I2S(Packet_PopInteger( ))+ ". EventType:" + I2S(Packet_PopInteger( ))+ ". OffsetX:" + I2S(Packet_PopInteger( ))+ ". OffsetY:" + I2S(Packet_PopInteger( ))+ ". ImageID:" + I2S(Packet_PopInteger( )))
    	endif 
    endfunction
    
    
    function Packet_TestSend takes nothing returns nothing 
    	local integer maxpackets = 20
    	loop 
    	call echo("Packet clear:")
    	call Packet_Clear( )
    	call echo("Packet push packettype(just integer)")
    	call Packet_PushInteger(0x12345678)
    	call echo("Packet push integer")
    	call Packet_PushInteger(maxpackets)
    	call echo("Packet push real")
    	call Packet_PushReal(1234.56)
    	call echo("Packet push real")
    	call Packet_PushReal(1234.56)
    	call echo("Packet send ")
    	call Packet_Send( )
    	call echo("Packet send ok")
    	exitwhen ( maxpackets <= 0 )
    	set maxpackets = maxpackets - 1
    	endloop
    endfunction
    
    function Packet_TestInitialize takes nothing returns nothing
    	// global code
    	local trigger t =CreateTrigger()
    	//call TriggerAddAction(t,function Packet_TestRecv)
    	call TriggerAddAction(t,function Packet_TestRecv2)
    	call Packet_Initialize(GetHandleId(t))
    	set t = null
    	
    	// local send
    	//call Packet_TestSend( )
    	call FuncTriggerRegisterPlayerKeyboardEvent('0')
    	call CFrameTest( )
    endfunction
    
    
    
    

    endcode

    Key codes:

    	 0-Z = 0-Z 
    	 "LBTN" =  Left mouse button
    	 "RBTN" =  Right mouse button
    	 "CANCEL" =  Control-break processing
    	 "MBTN" =  Middle mouse button (three-button mouse)
    	 "XBTN1" =  X1 mouse button
    	 "XBTN2" =  X2 mouse button
    	 "BACK" =  BACKSPACE key
    	 "TAB" =  TAB key
    	 "CLEAR" =  CLEAR key
    	 "RETURN" =  ENTER key
    	 "SHIFT" =  SHIFT key
    	 "CTRL" =  CTRL key
    	 "ALT" =  ALT key
    	 "PAUSE" =  PAUSE key
    	 "CAPS" =  CAPS LOCK key
    	 "KANA" =  IME Kana mode
    	 "VK_HANGUEL" =  IME Hangul mode
    	 "JUNJA" =  IME Junja mode
    	 "FINAL" =  IME final mode
    	 "HANJA" =  IME Hanja mode
    	 "VK_KANJI" =  IME Kanji mode
    	 "ESC" =  ESC key
    	 "CONV" =  IME convert
    	 "NCONV" =  IME nonconvert
    	 "ACCEPT" =  IME accept
    	 "MCHANGE" =  IME mode change request
    	 "SPACE" =  SPACEBAR
    	 "PAGEUP" =  PAGE UP key
    	 "PAGEDN" =  PAGE DOWN key
    	 "END" =  END key
    	 "HOME" =  HOME key
    	 "LEFT" =  LEFT ARROW key
    	 "UP" =  UP ARROW key
    	 "RIGHT" =  RIGHT ARROW key
    	 "DOWN" =  DOWN ARROW key
    	 "SELECT" =  SELECT key
    	 "PRINT" =  PRINT key
    	 "EXEC" =  EXECUTE key
    	 "SSHOT" =  PRINT SCREEN key
    	 "INSERT" =  INS key
    	 "DELETE" =  DEL key
    	 "HELP" =  HELP key
    	 "LWIN" =  Left Windows key (Natural keyboard)
    	 "RWIN" =  Right Windows key (Natural keyboard)
    	 "APPS" =  Applications key (Natural keyboard)
    	 "SLEEP" =  Computer Sleep key
    	 "NPAD0" =  Numeric keypad 0 key
    	 "NPAD1" =  Numeric keypad 1 key
    	 "NPAD2" =  Numeric keypad 2 key
    	 "NPAD3" =  Numeric keypad 3 key
    	 "NPAD4" =  Numeric keypad 4 key
    	 "NPAD5" =  Numeric keypad 5 key
    	 "NPAD6" =  Numeric keypad 6 key
    	 "NPAD7" =  Numeric keypad 7 key
    	 "NPAD8" =  Numeric keypad 8 key
    	 "NPAD9" =  Numeric keypad 9 key
    	 "MULT" =  Multiply key
    	 "ADD" =  Add key
    	 "SEP" =  Separator key
    	 "SUB" =  Subtract key
    	 "DEC" =  Decimal key
    	 "DIV" =  Divide key
    	 "F1" =  F1 key
    	 "F2" =  F2 key
    	 "F3" =  F3 key
    	 "F4" =  F4 key
    	 "F5" =  F5 key
    	 "F6" =  F6 key
    	 "F7" =  F7 key
    	 "F8" =  F8 key
    	 "F9" =  F9 key
    	 "F10" =  F10 key
    	 "F11" =  F11 key
    	 "F12" =  F12 key
    	 "F13" =  F13 key
    	 "F14" =  F14 key
    	 "F15" =  F15 key
    	 "F16" =  F16 key
    	 "F17" =  F17 key
    	 "F18" =  F18 key
    	 "F19" =  F19 key
    	 "F20" =  F20 key
    	 "F21" =  F21 key
    	 "F22" =  F22 key
    	 "F23" =  F23 key
    	 "F24" =  F24 key
    	 "NLOCK" =  NUM LOCK key
    	 "SCRL" =  SCROLL LOCK key
    	 "LSHFT" =  Left SHIFT key
    	 "RSHFT" =  Right SHIFT key
    	 "LCTRL" =  Left CONTROL key
    	 "RCTRL" =  Right CONTROL key
    	 "LALT" =  Left MENU key
    	 "RALT" =  Right MENU key
    	 "BBACK" =  Browser Back key
    	 "BFORW" =  Browser Forward key
    	 "BREFR" =  Browser Refresh key
    	 "BSTOP" =  Browser Stop key
    	 "BSEARCH" =  Browser Search key
    	 "BFAV" =  Browser Favorites key
    	 "BHOME" =  Browser Start and Home key
    	 "MUTE" =  Volume Mute key
    	 "V_DOWN" =  Volume Down key
    	 "V_UP" =  Volume Up key
    	 "NEXT" =  Next Track key
    	 "PREV" =  Previous Track key
    	 "STOP" =  Stop Media key
    	 "MPLAY" =  Play/Pause Media key
    	 "MAIL" =  Start Mail key
    	 "MSEL" =  Select Media key
    	 "APP1" =  Start Application 1 key
    	 "APP2" =  Start Application 2 key
    	 "OEM_1" =  Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ';:' key
    	 "OEM_P" =  For any country/region, the '+' key
    	 "COMMA" =  For any country/region, the ',' key
    	 "MINUS" =  For any country/region, the '-' key
    	 "PERIOD" =  For any country/region, the '.' key
    	 "OEM_2" =  Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '/?' key
    	 "OEM_3" =  Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '`~' key
    	 "ABNT_C1" =  Brazilian (ABNT) Keyboard
    	 "ABNT_C2" =  Brazilian (ABNT) Keyboard
    	 "OEM_4" =  Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '[{' key
    	 "OEM_5" =  Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '\|' key
    	 "OEM_6" =  Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ']}' key
    	 "OEM_7" =  Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the 'single-quote/double-quote' key
    	 "OEM_8" =  Used for miscellaneous characters; it can vary by keyboard.
    	 "OEM102" =  Either the angle bracket key or the backslash key on the RT 102-key keyboard
    	 "PROCKEY" =  IME PROCESS key
    	 "PACKET" =  Used to pass Unicode characters as if they were keystrokes.
    	 "ATTN" =  Attn key
    	 "CRSEL" =  CrSel key
    	 "EXSEL" =  ExSel key
    	 "EREOF" =  Erase EOF key
    	 "PLAY" =  Play key
    	 "ZOOM" =  Zoom key
    	 "NONAME" =  Reserved
    	 "PA1" =  PA1 key
    	 "OCLEAR" =  Clear key
    
    // ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строку Π² ΠΊΠΎΠ΄ клавиши (ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ клавиш)
    int __stdcall ConvertKeyStringToKeyCode( const char * str )
    // ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ клавиши Π² строку
    const char * __stdcall ConvertKeyCodeToKeyString( unsigned int code )
    
    Visit original content creator repository https://github.com/UnrealKaraulov/WarcraftIII_DLL_126-xxx
  • AllBuy

    AllBuy

    Demo app with functionality of a shop

    • Language: Python(logics), SQL(relational databases)
    • Appearance: PyQt5, PySimpleGUI
    • Databases: SQLite

    Functionality

    • On the main page are displayed all the products.
    • If you know what exactly you need you can use the search function.
    • Also, you can use filters. First you have to choose category and right after you will get specific filters for that particular category.
    • For each product there is main information.
    • For more information click on view more.
    • When view more is clicked a new widget appears with an image, full description of the product and 2 more features.
    • if you want to read what others thing of this product you could go straight to reviews, there you also can leave your impressions.
    • If you press add to card you add this to your cart, but sure first you have to log in.
    • On the main page, click the My Account: First we have to log in or register. If registered, you will get an email with verification code.
    • After this procedure if to press my account you will get a widget with general information about the user.
    • When you will find all the products you need and add them to basket, click the basket button on the main page to get to it.
    • in the basket you can choose the currency you want to pay in and press finish shopping.
    • Then you will have to enter you card number and if it is valid the purchase will be completed, then you also will receive a confirmation email.

    How to run?

    Run main.py

    Visit original content creator repository
    https://github.com/dinuScripnic/AllBuy