Vice City: Multiplayer

Server Development => Scripting and Server Management => Script Showroom => Topic started by: Sonmez on May 10, 2022, 07:38 AM

Title: Sonmez's New Chat System
Post by: Sonmez on May 10, 2022, 07:38 AM
As most of us know, the original chat in vcmp only supports English letters. So, I have created this custom chat system in order to use Turkish letters. It is also possible to bring support for different languages ​​by changing the font file.   

SERVER SIDE
[noae][noae][noae][noae][noae][noae][noae]function onClientScriptData( player ) {
  local int=Stream.ReadInt(), str=Stream.ReadString();
  local aColour = player.Colour, pcolor = format("[#%02X%02X%02X]", aColour.r, aColour.g, aColour.b);
  if(int==2022){for(local i = 0; i<100; i++){SendDataToClient(i, 2022, pcolor.tolower()+player.Name+": [#ffffff]"+str);}}
}

function SendDataToClient(p,i,s){
  p=FindPlayer(p);
  if(p){
    Stream.StartWrite();Stream.WriteInt(i);
  }
  if(s!=null){
    Stream.WriteString(s);
  }
  Stream.SendStream(p);
}
[/noae][/noae][/noae][/noae][/noae][/noae][/noae]

CLIENT SIDE
[noae][noae]// =================== Credits Goes To ysc3839 for Client Timer ==============================
function Script::ScriptProcess(){
  Timer.Process();
}

Timer <- {
 Timers = {}

 function Create(environment, listener, interval, repeat, ...)
 {
  // Prepare the arguments pack
  vargv.insert(0, environment);

  // Store timer information into a table
  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);

  // Store the timer information
  Timers.rawset(hash, TimerInfo);

  // Return the hash that identifies this timer
  return hash;
 }

 function Destroy(hash)
 {
  // See if the specified timer exists
  if (Timers.rawin(hash))
  {
   // Remove the timer information
   Timers.rawdelete(hash);
  }
 }

 function Exists(hash)
 {
  // See if the specified timer exists
  return Timers.rawin(hash);
 }

 function Fetch(hash)
 {
  // Return the timer information
  return Timers.rawget(hash);
 }

 function Clear()
 {
  // Clear existing timers
  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);
    }
   }
  }
 }
};

// ============================================================================================

local sX = GUI.GetScreenSize().X,sY = GUI.GetScreenSize().Y;
chatbox <-{Box = null EditBox = null}

function Script::ScriptLoad(){
  createChatBox();
}

function Server::ServerData( stream ){
 local readint=stream.ReadInt( ),readstr=stream.ReadString( );
 switch(readint.tointeger()){
  case 2022: chatProcess(readstr); break;
 }
}

function GUI::InputReturn( editbox ){
  if (editbox == chatbox.EditBox){
      if (chatbox.EditBox.Text == "" || chatbox.EditBox.Text == " " || chatbox.EditBox.Text == " " ){
        chatbox.EditBox = null;
      }else{
        if (chatbox.EditBox.Text.len() < 97){
          SendDataToServer(chatbox.EditBox.Text, 2022);
        }chatbox.EditBox = null;
      }         
  }
}

chat_key <- KeyBind( 0x59 );
function KeyBind::OnDown(key){
  if (key == chat_key){
    if(!chatbox.EditBox){
      createChatEditBox();
    }
  }
}

function VScreen(pos_x, pos_y){//Credits goes to Doom_Kill3R for this function
 local
     screenSize = GUI.GetScreenSize( ),
     x = floor( pos_x * screenSize.X / 1920 ),
     y = floor( pos_y * screenSize.Y / 1080 );
  return VectorScreen( x, y );
}
function SendDataToServer(s, i){local msg=Stream();msg.WriteInt(i.tointeger());msg.WriteString(s);Server.SendData(msg);}


function createChatBox(){
  chatbox.Box = GUIMemobox(VScreen( 10 , 25 ), VScreen(1000, 400), Colour(0, 0, 0, 255), GUI_FLAG_MEMOBOX_TOPBOTTOM | GUI_FLAG_VISIBLE | GUI_FLAG_TEXT_TAGS);
  chatbox.Box.RemoveFlags( GUI_FLAG_BACKGROUND | GUI_FLAG_BORDER );
  chatbox.Box.FontSize = floor( 17 * GUI.GetScreenSize( ).Y / 1080 );
  chatbox.Box.FontName = "TR Tahoma Bold"
  chatbox.Box.FontFlags = GUI_FFLAG_OUTLINE;
  chatbox.Box.LineHeight = 0;
}

function createChatEditBox(){
    chatbox.EditBox = GUIEditbox(VScreen( 15, 370 ), VScreen( 900, 30 ), Colour(0, 0, 0, 255), GUI_FLAG_TEXT_TAGS);
    chatbox.EditBox.FontSize = floor( 17 * GUI.GetScreenSize( ).Y / 1080 );
    chatbox.EditBox.TextColour = Colour(255, 255, 255, 255);
    chatbox.EditBox.FontName = "TR Tahoma Bold"
    chatbox.EditBox.FontFlags = GUI_FFLAG_OUTLINE;
    chatbox.EditBox.RemoveFlags( GUI_FLAG_BACKGROUND | GUI_FLAG_BORDER );
chatbox.EditBox.Text = "";
chatboxTimer <- Timer.Create(this, function(text, int) {
      chatbox.EditBox.Text = "";
  GUI.SetFocusedElement( chatbox.EditBox );
    }, 45, 1, "Timer Text ", 12345);
}
chatTimer <- null;
maxChatLine <- 15;
function chatProcess(readstr){
  if (chatbox.Box.LineHeight == 0){chatbox.Box.LineHeight = 1;}
    chatbox.Box.AddLine(readstr, Colour(255, 255, 255, 255))
    if(chatbox.Box.LineHeight < maxChatLine ){
      chatbox.Box.LineHeight += 1;
    }
    chatTimerProcess();
}

function chatTimerProcess(){
    Timer.Destroy( chatTimer );
    chatTimer <- Timer.Create(this, function(text, int) {
    if (chatbox.Box.LineHeight > 0 ){
      chatbox.Box.LineHeight -=1;
    }
    chatbox.Box.DisplayPos = 0;
 }, 10000, 0, "Timer Text ", 12345);
}
[/noae][/noae]

You need add fonts folder to store.
(https://forum.vc-mp.org/proxy.php?request=http%3A%2F%2Ffiles.thijn.ovh%2Fimg%2Fb118f16c04bdc4d9ea107b82e7a166ea%2Ffonts.zip&hash=f5ae3012e7a02d51c2961b8b2db6607d7bbc0292) (http://files.thijn.ovh/download/b118f16c04bdc4d9ea107b82e7a166ea/fonts.zip)

New Chat Key Is -> "Y"

Preview:
(https://i.ibb.co/b1nbdnw/unknown.png)

Good luck...
Title: Re: Sonmez's New Chat System
Post by: habi on May 10, 2022, 04:19 PM
You didn't tell in your post which key to press so chatbox come. I had to look at the codes = It is 'Y' key.

Now where to place the fonts folder? Inside store/scripts?

I managed to take two screenshots.

(https://i.imgur.com/ZNUr5oI.png)

(https://i.imgur.com/CPPaVXF.png)

As you can see (i don't know if it is because i placed fonts folder rightly or not) the letters are too small.

Again, i 'copy' a chinese character from google and paste into this chatbox, will it work? Or do i need chinese keyboard?

Thanks
Title: Re: Sonmez's New Chat System
Post by: Sonmez on May 12, 2022, 09:24 AM
It seems you did not place the Font folder correctly thats why the letters are small. True location is store folder. It should have been "store/fonts". Also you can find "floor( 17 * GUI.GetScreenSize( ).Y / 1080 );" this code in 2 places of code. You can change "17" with any other value in order to change your font size.

I haven't tested it with Chinese characters, but it is necessary to add a Chinese font, and change "TR Tahoma Bold" with the font which contains Chinese letters. Each key contains a keycode. If the keycodes supported by vcmp are limited, we can support those keys which are not supported ​​with manually configuring the fonts by changing keycodes.
Title: Re: Sonmez's New Chat System
Post by: habi on May 12, 2022, 03:16 PM
I had pasted it in wrong folder store/scripts/fonts

I am busy with something. I will certainly look into this.
Title: Re: Sonmez's New Chat System
Post by: Sebastian on May 14, 2022, 06:15 AM
Is it the same with the one from your server? :o
I remember it was a perfect alternative. Too bad we cannot actually force stop the default chat to open.


EDIT: Here is a video recorded when were testing it :D back in 2021-01-04-1256
https://youtu.be/bQRcEiZ9E2o
Title: Re: Sonmez's New Chat System
Post by: MRSK143 on May 16, 2022, 11:20 AM
Hey sonmez, how you have disabled the old chat box? i mean there wasn't showing any text of old box
Title: Re: Sonmez's New Chat System
Post by: Sonmez on May 17, 2022, 10:15 AM
Quote from: Sebastian on May 14, 2022, 06:15 AMIs it the same with the one from your server? :o
I remember it was a perfect alternative. Too bad we cannot actually force stop the default chat to open.


EDIT: Here is a video recorded when were testing it :D back in 2021-01-04-1256
https://youtu.be/bQRcEiZ9E2o


Hi Sebastian, it's been a long time I hope you're fine, and yes this chatbox is almost the same but unfortunately I lost my old files, and I had to reproduced them.
Title: Re: Sonmez's New Chat System
Post by: Sonmez on May 17, 2022, 10:18 AM
Quote from: MRSK143 on May 16, 2022, 11:20 AMHey sonmez, how you have disabled the old chat box? i mean there wasn't showing any text of old box
There is no method to prevent the default chat to open but you can add return false; in onPlayerChat() in order to disable this function.
Title: Re: Sonmez's New Chat System
Post by: Halilibow on May 17, 2022, 05:14 PM
good
Title: Re: Sonmez's New Chat System
Post by: Eirone on Jun 04, 2022, 08:02 AM
good job