Recent posts

#31
General Discussion / vcmp-game.dll either not desig...
Last post by Nihongo^ - Apr 02, 2026, 06:18 PM
How do i fix this  ?

#32
Servers / Re: [0.4] Vice City Cops & Rob...
Last post by KavenGTAVC - Mar 29, 2026, 06:10 PM
big fart
#33
Servers / [BETA] INVICTUS Arena
Last post by [TDA]Sicario - Mar 20, 2026, 12:01 AM
 
IP: 65.108.224.31:8138
Owner: Sicario
Developers: Sicario , Zer0neX
Discord: https://discord.gg/XeBxTHVSUX
Number of players slots: 100
Scripts: Squirrel
IRC Channel: -
Server Forum: -
About the server:
⚔️ Pure Arena Gameplay (Fast & Competitive)
• 💥 Smooth combat system & balanced weapons
• 🎯 Skill-based fights – no pay-to-win
• 🏆 Kill rewards & progression system
• 🔧 Constant updates & improvements
⚠️ The server is currently in Beta, so you may encounter bugs and changes as we continue to improve the experience.
Join now and become one of the first legends of INVICTUS Arena!
#34
Servers / Re: Grand Theft Auto Karachi C...
Last post by KazamaOp - Mar 17, 2026, 04:12 PM
🚨 Server Update Notice 🚨

Due to hosting issues, our server IP may change soon.

👉 Don't worry — you can always find the latest IP in our Discord server!
📌 Join here: https://discord.gg/F2KTJyQEDc

📍 Check the server-info channel for updates.

Stay connected and keep playing! 🎮🔥
#36
Bugs and Crashes / Vehicle arrows doesn't get syn...
Last post by Ankris - Mar 15, 2026, 10:23 PM
As title says, set the arrow to the vehicle when it is outside of sync radius for the player and then when vehicle gets streamed in, there is no arrow.

Working fine if the vehicle was already streamed in
#37
Client Scripting / VCMP Typewriter Animated Annou...
Last post by Mohamed Boubekri - Mar 11, 2026, 09:06 PM
Hey everyone, just a simple animated announcement system, type word by word.


Server-Side

enum StreamType
{
    Announce = 0x1
}
function onPlayerCommand( player, cmd, text )
{
if (cmd=="announce")
{
if (!text) return MessagePlayer("[#ff0000]Please use /announce <text>",player);
 for(local i = 0; i < GetMaxPlayers(); i++)
 {
    local plr = FindPlayer(i);
    if(!plr) continue;

    SendDataToClient(plr, StreamType.Announce, text);
 }
}
else MessagePlayer("[#ff0000]Invalid cmd",player);
}
function onClientScriptData( player )
{
    local stream = Stream.ReadByte();
    switch ( stream )
    {
        case StreamType.Announce:
          for(local i = 0; i < GetMaxPlayers(); i++)
          {
            local plr = FindPlayer(i);
            if(!plr) continue;
 
            PlaySound(plr.World, 50003, plr.Pos);
          }
    break;
    }

function SendDataToClient( player, ... )
{
    if( vargv[0] )
    {
        local    byte = vargv[0],
                len = vargv.len();
               
        if( 1 > len ) devprint( "ToClent <" + byte + "> No params specified." );
        else
        {
            Stream.StartWrite();
            Stream.WriteByte( byte );

            for( local i = 1; i < len; i++ )
            {
                switch( typeof( vargv[i] ) )
                {
                    case "integer": Stream.WriteInt( vargv[i] ); break;
                    case "string": Stream.WriteString( vargv[i] ); break;
                    case "float": Stream.WriteFloat( vargv[i] ); break;
                }
            }
           
            if( player == null ) Stream.SendStream( null );
            else if( typeof( player ) == "instance" ) Stream.SendStream( player );
            else devprint( "ToClient <" + byte + "> Player is not online." );
        }
    }
    else devprint( "ToClient: Even the byte wasn't specified..." );
}

Client-Side

enum StreamType
{
    Announce = 0x1
}

screenX <- GUI.GetScreenSize().X;
screenY <- GUI.GetScreenSize().Y;

local announceQueue = [0,1], typedChars = 0, typingTimer, announceSprite, announceLabel;

Timer <- {
 Timers = {}

 function Create(environment, listener, interval, repeat, ...)
 {
  vargv.insert(0, environment);

  local TimerInfo = {
  Environment = environment,
  Listener = listener,
  Interval = interval,
  Repeat = repeat,
  Args = vargv,
  LastCall = Script.GetTicks(),
  CallCount = 0
  };

  local hash = split(TimerInfo.tostring(), ":")[1].slice(3, -1).tointeger(16);
  Timers.rawset(hash, TimerInfo);

  return hash;
 }

 function Destroy(hash)
 {
  if (Timers.rawin(hash))
  {
  Timers.rawdelete(hash);
  }
 }

 function Exists(hash)
 {
  return Timers.rawin(hash);
 }

 function Fetch(hash)
 {
  return Timers.rawget(hash);
 }

 function Clear()
 {
  Timers.clear();
 }

 function Process()
 {
  local CurrTime = Script.GetTicks();

  foreach (hash, tm in Timers)
  {
  if (tm != null)
  {
    if (CurrTime - tm.LastCall >= tm.Interval)
    {
    tm.CallCount++;
    tm.LastCall = CurrTime;

    tm.Listener.pacall(tm.Args);

    if (tm.Repeat != 0 && tm.CallCount >= tm.Repeat)
      Timers.rawdelete(hash);
    }
  }
  }
 }
};

function Script::ScriptProcess()
{
 Timer.Process();
}

function Server::ServerData( stream )
{
    local type = stream.ReadByte();

    switch( type )
    {
        case StreamType.Announce:
        {
            local announceText = stream.ReadString();

            if (typingTimer == null)
            {
                if ( announceText.len() > 90 )
                    return Console.Print("You can't announce more than 90 characters");

                typingTimer = "lock";

                Console.Print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

                announceQueue.insert(0,announceText);

                local centerY = screenY / 2, startY = centerY * 0.3;

                announceSprite = GUISprite( "ann.png", VectorScreen( screenX / 2, startY ) );
                announceSprite.Size = VectorScreen( screenX * 0.05, screenY * 0.06 );
                announceSprite.Alpha = 255;

                SendDataToServer(StreamType.Announce);   

                Timer.Create( this, MoveAnnouncementUp, 50, 15 );       
                Timer.Create( this, CreateAnnouncementLabel, 750, 1 );
                Timer.Create( this, StartHorizontalMovement, 750, 1 );
            }
            else Console.Print("Wait until the first announcement disappears");
        }
        break;
    }
}

function MoveAnnouncementUp()
{
    local offset = screenY * -0.009;
    announceSprite.Pos.Y += offset;   
}

function StartHorizontalMovement()
{
    Timer.Create( this, MoveAnnouncementLeft, 40, 15 );
}

function MoveAnnouncementLeft()
{
    local offset = screenX * -0.032;
    announceSprite.Pos.X += offset;   
}

function CreateAnnouncementLabel()
{
    announceLabel = GUILabel(VectorScreen( screenX * 0.047, screenY * 0.013 ), Colour( 0, 0, 0 ), "");
    announceLabel.FontSize = screenY * 0.02;

    announceSprite.AddChild(announceLabel);

    typingTimer = Timer.Create( this, TypewriterEffect, 90, announceQueue[0].len() );
    Timer.Create( this, DestroyAnnouncement, 10000, 1 );
}

function TypewriterEffect()
{
    local pos = typedChars += 1, prev = pos-1, text = announceQueue[0];
    announceLabel.Text += text.slice(prev,pos);

    local shakeX = screenX * 0.002; // shake effect when typing
    local shakeY = screenY * 0.002;

    if (pos % 2 == 0)
    {
        announceSprite.Pos.X += shakeX;
        announceSprite.Pos.Y += shakeY;
    }
    else
    {
        announceSprite.Pos.X -= shakeX;
        announceSprite.Pos.Y -= shakeY;
    }
}

function DestroyAnnouncement()
{
 announceQueue.clear();
 announceLabel = null;
 announceSprite = null;
 typedChars = 0;

 Timer.Destroy(typingTimer);
 typingTimer = null;
}

function SendDataToServer( ... )
{
    if( vargv[0] )
    {
        local byte = vargv[0],
        len = vargv.len();
               
        if( 1 > len ) Console.Print( "ToClient <" + byte + "> No params specified." );
        else
        {
            local stream = Stream();
            stream.WriteByte( byte );

            for( local i = 1; i < len; i++ )
            {
                switch( typeof( vargv[i] ) )
                {
                    case "integer": stream.WriteInt( vargv[i] ); break;
                    case "string": stream.WriteString( vargv[i] ); break;
                    case "float": stream.WriteFloat( vargv[i] ); break;
                }
            }
           
            Server.SendData( stream );
        }
    }
    else Console.Print( "ToClient: Not even the byte was specified..." );
}

Download sound and sprite from here and put them in store folder. Enjoy !

Credits:
ysc3839 - Client Timers
#38
Servers / Re: [0.4] littlewhitey's VC-MP...
Last post by JF_THUNDER - Mar 10, 2026, 11:15 AM
Quote from: AssassinSensei on Mar 08, 2026, 08:22 PMIcant play it says register first i cant play it kicks me
So you came all the way here just to tell this?
#39
Servers / Re: [0.4] littlewhitey's VC-MP...
Last post by AssassinSensei - Mar 08, 2026, 08:22 PM
Icant play it says register first i cant play it kicks me
#40
Weapon Showroom / Re: [WEP] behold, Dog!
Last post by Sparrow - Mar 07, 2026, 12:15 AM
Ripped/Included Animations: (Note: axxx_xxxxxx animations are ELDEN RING Animation IDs that I used.)
IDLE_stance:    a000_000000
SEAT_down:    a000_020012
SEAT_idle:    a000_030002
SEAT_up:    a000_020002
WEAPON_crouch:    a000_030002

run_player:    a000_002000
run_back:    a000_002001
run_left:    a000_002002
run_right:    a000_002003

WALK_start:        a000_002000
walk_start_back:    a000_002001
walk_start_left:    a000_002002
walk_start_right:    a000_002003

WALK_player:    a000_002000
walk_back:    a000_002001
walk_left:    a000_002002
walk_right:    a000_002003

sprint_civi:    a000_002100
Run_stop:    a000_002100
Run_stopR:    a000_002100

Full Attack:    a000_003000    (Scaled Down to 117 Frames)
KICK_floor:    a000_003003

knife_part:        a000_003004
WEAPON_knife_1:        Full Attack Pt. 1    (0 -> 35)
WEAPON_knife_2:        Full Attack Pt. 2    (35 -> 55)
WEAPON_knife_3:        Full Attack Pt. 3    (55 -> 117)
WEAPON_knifeidle:    a000_000020


Full Jump:    a000_006100
JUMP_glide:   Part of Full Jump
JUMP_land:    Part of Full Jump

FALL_fall:    a000_007000
FALL_glide:    a000_007000
FALL_land:    a000_007400
FALL_collapse:    a000_007401

getup:        a000_011050
getup_front:    a000_011050

HIT_chest:    a000_008040
HIT_bodyblow:    a000_008045
HIT_front:    a000_008100
HIT_back:    a000_008040
HIT_behind:    a000_008040
HIT_walk:    a000_008100
HIT_head:    a000_008050
HIT_L:        a000_008046
HIT_R:        a000_008047
HIT_wall:    a000_008300
FLOOR_hit:    a000_011061
FLOOR_hit_f:    a000_011061

SHOT_leftP:    a000_008191
SHOT_rightP:    a000_008191
SHOT_partial:    a000_009000

Drown:        a000_007600
KO_skid_back:    a000_007600
KO_skid_front:    a000_010040
KO_shot_front:    a000_010000
KO_shot_face:    a000_010000
KO_shot_stom:    a000_010000
KO_shot_armL:    a000_010000
KO_shot_armR:    a000_010000
KO_shot_legL:    a000_010000
KO_shot_legR:    a000_010000
KO_spin_L:    a000_010000
KO_spin_R:    a000_010000

Animations "WEAPON_knife_3" and "WEAPON_knifeidle" are unused due to a VCMP bug with knife where it tries to merge the default GTA VC animations with the custom animations in the custom ".ifp" file. Therefore, I couldn't get the 3-chain combo to work.