Recent posts

#1
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
#2
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?
#3
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
#4
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.
#5
Skin Showroom / [SKIN] behold, Dogs!
Last post by Sparrow - Mar 07, 2026, 12:10 AM
Content Type: Skin. (Can be labelled as mixed since it goes with specific skins that I will link to after I make a topic about them in Weapon Showroom)
Original Author: Ranga and Kumara are ripped from "SLIME - ISEKAI Memories" by " Strifffe ". Red Wolf I ripped from ELDEN RING.
Source Link:
Ranga (FBX): https://www.deviantart.com/strifffe/art/Ranga-Evolved-FBX-from-SLIME-ISEKAI-Memories-912499859
Kumara (FBX): https://www.deviantart.com/strifffe/art/Kumara-FBX-from-SLIME-ISEKAI-Memories-952115981
Red Wolf: Haven't uploaded the ripped model anywhere yet.
Modifications: None. Simply added them to GTA VC as skins.
Modified By: Me.
Authorized By Original Author?:
Red Wolf: Yes. (I'm him)
Ranga & Kumara: Couldn't get in touch with him. He did allow it as long as I credit him though so should be fine.
Additions: This skin works best with the Dog weapon I made. They were meant to be used together.
Dog/RedWolf Weapon: https://forum.vc-mp.org/index.php?topic=9899.new#new
Download:
Ranga (VCMP Version): https://www.mediafire.com/file/hnopal9q1uzw4n9/z211_Ranga.7z/file
Kumara (VCMP Version): https://www.mediafire.com/file/2hlwsmzkq869myv/z214_Kumara.7z/file
Red Wolf (VCMP Version): https://www.mediafire.com/file/qomnies9uaf2tx8/z213_RedWolf.7z/file
Content Screenshots: https://imgchest.com/p/ne7b3dnvvy5
#6
Weapon Showroom / [WEP] behold, Dog!
Last post by Sparrow - Mar 07, 2026, 12:01 AM
Content Type: Weapon. (Can be labelled as mixed since it goes with specific skins that I will link to after I make a topic about them in Skin Showroom)
Original Author: I ripped the animations from ELDEN RING and retargeted them to VCMP.
Source Link: My PC.
Modifications:: Retargeted animations from ELDEN RING and modified XML to get it to work.
Modified By: Me.
Authorized By Original Author?: Yes. (I'm him)
Additions: This weapon is just animations. It has no model nor texture. The weapon works ideally with dog-like skins.
Reference Link: https://forum.vc-mp.org/index.php?topic=9900.new#new
Will also leave info of which animations I've ripped/used in this weapon in case anybody cares for whatever reason.
Download: https://www.mediafire.com/file/1p5au5cpi8y0bum/w112_s1_l5_RedWolf.7z/file
Content Screenshots: https://imgchest.com/p/ne7b3dnvvy5

#7
Bugs and Crashes / Vehicle damage data doesn't sy...
Last post by Ankris - Mar 06, 2026, 11:12 PM
Vehicle damage data (SetVehicleDamageData, GetVehicleDamageData) doesn't get synced to the players when the vehicle gets streamed to the player
#8
Support / Re: cant connect to server
Last post by vitovc - Mar 02, 2026, 04:21 PM
or maybe server (host) bannned you. or you (your ISP) banned server. try to check ping <ip of server> in cmd.exe
#9
Support / Re: cant connect to server
Last post by Gulk - Mar 02, 2026, 11:04 AM
try whitelist gta-vc.exe on windows firewall
#10
Support / cant connect to server
Last post by MR.HERNANDEZ - Feb 23, 2026, 08:54 PM
after long time i tried to install vice city mp but when i connect any server its says could not connect server and trying to reconnect and no thing happnes i need help please