Page 1 of 2 12 LastLast
Results 1 to 10 of 12

Thread: Player movement & grenades.

  1. #1
    Private First Class
    Join Date
    Oct 2013
    Posts
    219
    Thanks
    56
    Thanked 105 Times in 66 Posts

    Player movement & grenades.

    Usage:
    player setWalkDir(string); //Set the walk direction for a player/bot. Very similar to moveTo() but accounts for collision!
    player setWalkAngle(int); //Same as setWalkDir(string) but allows more configuration.
    player setWepType(string); //This is to fix bot shooting with rifle weapons. Not needed if someone made a func to grab your current weapon type via libcod.
    player throwNade(bool); //Holds grenade while true, then throws it after changing to false. Untested on real clients, works fine with bots.
    player getCookTime(); //Returns time left until grenade explodes while cooking grenade. Can also be used to detect whether player is holding a grenade.

    It may also be possible to make funcs such as playerShoot, playerADS, changeStance etc. with a little more tweaking and testing.

    PHP Code:
    onPlayerConnect()
    {
        
    self setWalkDir("none");
        
    self setWepType("none");
    }

    doPlayerMovement()
    {
        
    self setWalkDir("forward");
        
    self setWalkAngle(127); //Forward
        
    self setWalkDir("back");
        
    self setWalkAngle(129); //Back
        
    self setWalkDir("right");
        
    self setWalkAngle(127 << 8); //Right
        
    self setWalkDir("left");
        
    self setWalkAngle(129 << 8); //Left

        
    self setWalkAngle((129 << 8) | 127); //Left + forward (Untested)

        
    self setWalkDir("none");
    }
    playThrowNade()
    {
        if(!
    self getCookTime()) //Not currently holding nade
            
    self throwNade(true);
            
    wait 3;
            
    self throwNade(false);
        }
    }
    weaponSetup()
    {
        
    //Only needed if you wish to make bots work with stock weapons.
        
    if(self getcurrentweapon() == "kar98k_rifle_mp")
            
    self setWepType("rifle");
        else
            
    self setWepType("none");

    Installation
    Open libcod.cpp, add;
    PHP Code:
    int client_movement[64] = {0};
    int bot_shoot[64] = {0};
    int bot_wepType[64] = {0};
    int bot_throwNade[64] = {0};

    cHook *hook_play_movement;
    int play_movement(int a1int a2)
    {
        
    #if COD_VERSION == COD2_1_0
            
    int offset 0x841FB0C;
        
    #elif COD_VERSION == COD2_1_2
            
    int offset 0x842200C;
        
    #elif COD_VERSION == COD2_1_3
            
    int offset 0x842308C;
        
    #else
            #warning play_movement() got no working addresses
            
    int offset 0x0;
        
    #endif
        
        
    extern int playerinfo_baseplayerinfo_size;
        
    int addrtypeclientnum;
        
        
    clientnum = (a1 - *(int*)offset) / playerinfo_size;
        if(*(
    int*)(*(int*)playerinfo_base clientnum playerinfo_size) == 4)
        {
            
    addrtype gsc_libcod_getAddressType(clientnum);
            
            if(
    addrtype == 0//bot stuff here
            
    {
                if(!
    bot_throwNade[clientnum])
                {
                    if(!
    bot_wepType[clientnum])
                    {
                        if(
    bot_shoot[clientnum] == 4097)
                            
    bot_shoot[clientnum] = 0;
                        else
                            
    bot_shoot[clientnum] = 4097;
                    } else
                        
    bot_shoot[clientnum] = 4097;
                } else {
                    
    bot_shoot[clientnum] = 65536;
                }
                
                *(
    int *)(a2 4) = bot_shoot[clientnum];
                
                if(!
    client_movement[clientnum])
                    *(
    int *)(a2 24) = 0;
                else
                    *(
    int *)(a2 24) = client_movement[clientnum];
            } else { 
    //player stuff here
                
    if(client_movement[clientnum])
                    *(
    int *)(a2 24) = client_movement[clientnum];
            }
        }
        
        
    hook_play_movement->unhook();
        
    int (*sig)(int a1int a2);
        *(
    int *)&sig hook_play_movement->from;
        
    int ret sig(a1a2);
        
    hook_play_movement->hook();
        
        return 
    ret;

    Also add the following at the correct location in libcod.cpp;
    PHP Code:
    //1.0
                
    hook_play_movement = new cHook(0x0808F488, (int)play_movement);
                
    hook_play_movement->hook();
    //1.2
                
    hook_play_movement = new cHook(0x08090D18, (int)play_movement);
                
    hook_play_movement->hook();
    //1.3
                
    hook_play_movement = new cHook(0x08090DAC, (int)play_movement);
                
    hook_play_movement->hook(); 
    Open gsc_player.cpp and add the following;
    PHP Code:
    void gsc_player_set_walkdir(int id)
    {
        
    charwalkDir;
        
        if ( ! 
    stackGetParams("s", &walkDir)) {
            
    printf("scriptengine> ERROR: gsc_player_set_walkdir(): param \"walkDir\"[1] has to be an string!\n");
            
    stackPushUndefined();
            return;
        }
        
        
    extern int client_movement[64];
        if(!
    strcmp(walkDir"none"))
            
    client_movement[id] = (0);
        else if(!
    strcmp(walkDir"forward"))
            
    client_movement[id] = (127);
        else if(!
    strcmp(walkDir"back"))
            
    client_movement[id] = (129);
        else if(!
    strcmp(walkDir"right"))
            
    client_movement[id] = (127 << 8);
        else if(!
    strcmp(walkDir"left"))
            
    client_movement[id] = (129 << 8);
    }

    void gsc_player_set_walkangle(int id)
    {
        
    int walkDir;
        
        if ( ! 
    stackGetParams("i", &walkDir)) {
            
    printf("scriptengine> ERROR: gsc_player_set_walkangle(): param \"walkDir\"[1] has to be an int!\n");
            
    stackPushUndefined();
            return;
        }
        
        
    extern int client_movement[64];
        if(!
    walkDir)
            
    client_movement[64] = (0);
        else
            
    client_movement[64] = (walkDir);
    }

    void gsc_player_set_weptype(int id)
    {
        
    charwepType;
        
        if ( ! 
    stackGetParams("s", &wepType)) {
            
    printf("scriptengine> ERROR: gsc_player_set_weptype(): param \"wepType\"[1] has to be an string!\n");
            
    stackPushUndefined();
            return;
        }
        
        
    extern int bot_wepType[64];
        if(!
    strcmp(wepType"rifle"))
            
    bot_wepType[id] = (0);
        else
            
    bot_wepType[id] = (1);
    }

    void gsc_player_thrownade(int id)
    {
        
    int throwNade;
        
        if ( ! 
    stackGetParams("i", &throwNade)) {
            
    printf("scriptengine> ERROR: thrownade(): param \"throwNade\"[1] has to be an int!\n");
            
    stackPushUndefined();
            return;
        }
        
        
    extern int bot_throwNade[64];
        
    bot_throwNade[id] = (throwNade);
    }

    void gsc_player_getcooktime(int id) {
        
    int nadetime PLAYERSTATE(id) + 60;
        
        if(*(
    int*)nadetime)
            
    stackPushInt(*(int*)nadetime);
        else 
            
    stackPushInt(0);

    Open gsc_player.hpp and add the following;
    PHP Code:
    void gsc_player_set_walkdir(int id);
    void gsc_player_set_walkangle(int id);
    void gsc_player_set_weptype(int id);
    void gsc_player_thrownade(int id);
    void gsc_player_getcooktime(int id); 
    Open gsc.cpp and add the following in the correct location;
    PHP Code:
        {"setwalkdir"            gsc_player_set_walkdir        0},
        {
    "setwalkangle"          gsc_player_set_walkangle      0},
        {
    "setweptype"            gsc_player_set_weptype        0},
        {
    "thrownade"             gsc_player_thrownade          0},
        {
    "getcooktime"           gsc_player_getcooktime        0}, 
    Compile and you are done.

    Note: Adding this will fix a few bugs with bots. If using setWepType, stock weapons will work with bots correctly. Also this automatically fixes a bug with bot torso/legs being out of alignment.
    Last edited by filthy_freak_; 13th July 2015 at 05:27.

  2. The Following 5 Users Say Thank You to filthy_freak_ For This Useful Post:

    kung foo man (13th July 2015),Mitch (13th July 2015),Ni3ls (13th July 2015),serthy (13th July 2015),YuriJurek (13th July 2015)

  3. #2
    Assadministrator IzNoGoD's Avatar
    Join Date
    Aug 2012
    Posts
    1,718
    Thanks
    17
    Thanked 1,068 Times in 674 Posts
    Setwalkangle is a confusing function name as you do not set the angle, you set the amount a client presses the buttons. Please be aware of this and maybe change it to a two-input function for forward/back and left/right (-128 to 127, although real clients are limited to -127 to 127)
    "Does not work" is an error report for a bug between keyboard and chair.

    All hail Artie Effem

  4. The Following User Says Thank You to IzNoGoD For This Useful Post:

    kung foo man (13th July 2015)

  5. #3
    Assadministrator kung foo man's Avatar
    Join Date
    Jun 2012
    Location
    trailerpark
    Posts
    2,010
    Thanks
    2,102
    Thanked 1,084 Times in 753 Posts
    Quote Originally Posted by IzNoGoD View Post
    you set the amount a client presses the buttons
    What does this mean? Would 80 e.g. be half speed forward? Like sensitive joystick movement?
    timescale 0.01

  6. #4
    Assadministrator IzNoGoD's Avatar
    Join Date
    Aug 2012
    Posts
    1,718
    Thanks
    17
    Thanked 1,068 Times in 674 Posts
    Quote Originally Posted by kung foo man View Post
    What does this mean? Would 80 e.g. be half speed forward? Like sensitive joystick movement?
    Yup.
    10char
    "Does not work" is an error report for a bug between keyboard and chair.

    All hail Artie Effem

  7. #5
    Corporal voron00's Avatar
    Join Date
    Nov 2014
    Posts
    248
    Thanks
    64
    Thanked 216 Times in 116 Posts
    Big update on this one in my libcod repo:

    First of all, these functions will only work on bots now, i see no purpose for then on a real players.

    setWalkDir(dir); // Unchanged
    setLean(dir); Values: "left", "right", "none". Bot lean left/right.
    setStance(stance); // Values: "stand", "crouch", "prone", "jump". Bot stance. (crouching etc.)
    throwNade(bool); // Unchanged but improved it's behavior (can be used in any stance, etc.)
    fireWeapon(bool); // Bot shooting.
    meleeWeapon(bool); // Bot meeleing.
    reloadWeapon(bool); // Bot reloading.
    adsAim(bool); // Bot ADS.
    switchToWeaponId(weapon id); // Bot switches to a specified weapon id (if bot doesn't have that weapon, just nothing happens.)

    Bellow functions has been removed:

    setWepType(weap type); // No idea what was it for, proably some misunderstanding.
    setWalkAngle(dir); // Maybe will readd it with a proper name. But i haven't seen any real purpose of using it.

    But let's go to a practice usage lol.
    A weird idea came in to my mind:

    Bot - Companion:



    A bot that follows you and shoots whatever he sees, also bot is controlled by a quick messages, he can go to desired position and wait or just follow.
    Bot easily kicks ass, can melee, smartly switches weapons, tries to move in combat, reloads when he can.

    Edit: Okay, You'll need a Mitch's weapon functions for this (https://killtube.org/showthread.php?...oveSpeedScale)) also it may contain some code made by kung or izno and maybe others.

    companion.gsc
    PHP Code:
    companionSpawn() // Call this to spawn a companion
    {
        
    companion addTestClient();
        if (
    isDefined(companion))
        {
            
    companion resetFunctions();
            
    companion.isBot true;
            
    wait 0.5;
            
    companion renameClient(self.name "^7's Companion");
            
    companion.pers["team"] = self.pers["team"];
            
    companion.pers["weapon"] = self.pers["weapon"];
            
    companion.owner self;
            
    self.companion companion;
            
    companion maps\mp\gametypes\tdm::spawnPlayer(); // <-------- YOUR GAMETYPE SPAWNPLAYER
            
    companion thread companionLogic();
            
    companion setOrigin(companion.owner.origin + (0025));
            
    // setCvar("g_antilag", 0);
        
    }
    }

    companionLogic()
    {
        
    self endon("disconnect");

        
    self.enemy undefined;

        
    self.state spawnStruct();
        
    self.state.following 1;
        
    self.state.movingtopos undefined;
        
    self.state.agressive 1;
        
    self.state.lastreloadtime getTime();
        
    self.state.lastweaponslot "none";

        while(
    isDefined(self))
        {
            if (
    isAlive(self))
            {
                if (!
    isDefined(self.owner))
                {
                    
    kick2(self getEntityNumber(), "owner disconnected.");
                    
    // setCvar("g_antilag", 1);
                
    }

                if (!
    isAlive(self.owner))
                {
                    
    kick2(self getEntityNumber(), "owner died.");
                    
    // setCvar("g_antilag", 1);
                
    }

                
    self ladderCheck();

                if (
    isDefined(self.state.movingtopos))
                {
                    
    self adsAim(false);
                    
    angles vectorToAngles(vectorNormalize(self.state.movingtopos self getRealEye()));
                    
    self setPlayerAngles(angles);
                    if (
    distance(self.originself.state.movingtopos) > 25)
                    {
                        
    self setWalkDir("forward");
                    }
                    else
                    {
                        
    // Bot reached target position
                        
    self.state.movingtopos undefined;
                        
    self setWalkDir("none");
                        
    self notify("menuresponse""quickstatements""3");
                    }
                }
                else
                {
                    if (
    self.state.following)
                    {
                        
    // Teleport companion back to its owner if they went to far away from each other
                        
    if (distance(self.owner.originself.origin) > 1000)
                            
    self setOrigin(self.owner.origin + (0025));
                    }

                    
    self.enemy self getNearestPlayerForBot(self getOpposingTeam(self.pers["team"]));
                    if (
    self.state.agressive && isDefined(self.enemy))
                    {
                        
    // Don't just stand there...
                        
    self thread randomMoving();

                        
    // Do not reload on enemy
                        
    self.state.lastreloadtime getTime();

                        
    // Out of ammo in clip but other weapon has ammo, switch to it.
                        
    if (!self getWeaponSlotClipAmmo(self getCurrentWeaponSlot()) && self getWeaponSlotClipAmmo(self getOppositeWeaponSlot()))
                            
    self switchToWeaponId(maps\mp\gametypes\_weaponfunctions::getWeaponId(self getWeaponSlotWeapon(self getOppositeWeaponSlot())));
                        
    // No ammo for both clips, use main weapon. Edit: if it has ammo.
                        
    else if (!self getWeaponSlotClipAmmo(self getCurrentWeaponSlot()) && !self getWeaponSlotClipAmmo(self getOppositeWeaponSlot()) && botHasAmmo("primary"))
                        {
                            if (
    self getCurrentWeaponSlot() != "primary")
                                
    self switchToWeaponId(maps\mp\gametypes\_weaponfunctions::getWeaponId(self getWeaponSlotWeapon(self getOppositeWeaponSlot())));
                        }
                        
    // No ammo in one slot, but have it in other, switch to another weapon.
                        
    else if (!self botHasAmmo(self getCurrentWeaponSlot()) && self botHasAmmo(self getOppositeWeaponSlot()))
                            
    self switchToWeaponId(maps\mp\gametypes\_weaponfunctions::getWeaponId(self getWeaponSlotWeapon(self getOppositeWeaponSlot())));

                        
    angles vectorToAngles(vectorNormalize(self.enemy getRealEye() - (self getRealEye() + (0020))));
                        
    self setPlayerAngles(angles);

                        if (
    distance(self.originself.enemy.origin) < 75)
                        {
                            
    self adsAim(false);
                            
    self thread botMelee();
                        }
                        else if (
    self botHasAmmo(self getCurrentWeaponSlot()))
                        {
                            if (
    distance(self.originself.enemy.origin) > 350)
                                
    self adsAim(true);
                            else
                                
    self adsAim(false);

                            
    self thread botShoot();
                        }
                        else
                            
    self adsAim(false);
                    }
                    else
                    {
                        
    self adsAim(false);

                        if (
    getTime() > self.state.lastreloadtime 3000)
                        {
                            if (
    self getWeaponSlotClipAmmo(self getCurrentWeaponSlot()) < maps\mp\gametypes\_weaponfunctions::weaponClipSize(self getWeaponSlotWeapon(self getCurrentWeaponSlot())))
                            {
                                
    // Try to reload now
                                
    self reloadWeapon(true);
                                
    // Reset reload timer
                                
    self.state.lastreloadtime getTime();
                            }
                            else if ((
    self botHasAmmo(self getOppositeWeaponSlot())) && (self getWeaponSlotClipAmmo(self getOppositeWeaponSlot()) < maps\mp\gametypes\_weaponfunctions::weaponClipSize(self getWeaponSlotWeapon(self getOppositeWeaponSlot()))))
                                
    self switchToWeaponId(maps\mp\gametypes\_weaponfunctions::getWeaponId(self getWeaponSlotWeapon(self getOppositeWeaponSlot())));
                        }

                        
    angles vectorToAngles(vectorNormalize(self.owner getRealEye() - self getRealEye()));
                        
    self setPlayerAngles(angles);
                        if (
    self.state.following && distance(self.originself.owner.origin) > 150)
                        {
                            
    self setWalkDir("forward");
                        }
                        else
                            
    self setWalkDir("none");
                    }
                    
    self.state.lastweaponslot self getCurrentWeaponSlot();
                }
            }
            else
            {
                
    kick2(self getEntityNumber(), "companion died.");
                
    // setCvar("g_antilag", 1);
            
    }
            
    wait 0.05;
            
    // Reload always false on endframe
            
    self reloadWeapon(false);
            
    // 0 - ignore state, always on endframe
            
    self switchToWeaponId(0);
        }
    }

    botHasAmmo(slot)
    {
        if (
    self getWeaponSlotClipAmmo(slot) + self getWeaponSlotAmmo(slot))
            return 
    true;
        else
            return 
    false;
    }

    botMelee()
    {
        
    self endon("disconnect");

        if (
    isDefined(self.meleeing))
            return;

        
    self.meleeing 1;
        
    self meleeWeapon(true);
        
    wait 0.05;
        
    self meleeWeapon(false);
        
    wait 0.05;
        
    self.meleeing undefined;
    }

    botShoot()
    {
        
    self endon("disconnect");

        if (
    isDefined(self.shooting))
            return;

        
    self.shooting 1;
        
    self fireWeapon(true);
        
    wait 0.05;
        
    self fireWeapon(false);
        
    wait 0.05;
        
    self.shooting undefined;
    }

    resetFunctions()
    {
        
    self setWalkDir("none");
        
    self setLean("none");
        
    self setStance("stand");
        
    self throwNade(false);
        
    self fireWeapon(false);
        
    self meleeWeapon(false);
        
    self reloadWeapon(false);
        
    self adsAim(false);
        
    self switchToWeaponId(0);
    }

    randomMoving(number)
    {
        
    self endon("disconnect");

        if (
    isDefined(self.movingincombat))
            return;

        
    self.movingincombat 1;

        
    number randomInt(5);
        switch(
    number)
        {
        case 
    0:
            
    self setWalkDir("forward");
            
    wait randomIntRange(35);
            break;

        case 
    1:
            
    self setWalkDir("left");
            
    wait randomIntRange(35);
            break;

        case 
    2:
            
    self setWalkDir("right");
            
    wait randomIntRange(35);
            break;

        case 
    3:
            
    self setWalkDir("back");
            
    wait randomIntRange(35);
            break;

        default:
            
    self setWalkDir("none");
            
    wait randomIntRange(35);
            break;
        }

        
    self.movingincombat undefined;
    }

    ladderCheck()
    {
        if (
    self isOnLadder())
            return;

        if (
    self isMantling())
            return;

        if (
    self getCurrentWeapon() == "none")
            
    self switchToWeaponId(maps\mp\gametypes\_weaponfunctions::getWeaponId(self getWeaponSlotWeapon(self.state.lastweaponslot)));
    }

    messageControl(saytext)
    {
        if (!
    isDefined(self.companion))
            return;

        switch(
    saytext)
        {
        case 
    "QUICKMESSAGE_FOLLOW_ME":
        case 
    "QUICKMESSAGE_REGROUP":
            
    self.companion.state.following 1;
            
    self.companion.state.movingtopos undefined;
            break;

        case 
    "QUICKMESSAGE_HOLD_THIS_POSITION":
            
    self.companion.state.following 0;
            
    self.companion.state.movingtopos undefined;
            break;

        case 
    "QUICKMESSAGE_MOVE_IN":
            
    self.companion.state.following 0;
            
    self.companion.state.movingtopos self playerLookPosition(10000);
            break;

        case 
    "QUICKMESSAGE_HOLD_YOUR_FIRE":
            
    self.companion.state.agressive 0;
            break;

        case 
    "QUICKMESSAGE_SUPPRESSING_FIRE":
            
    self.companion.state.agressive 1;
            break;

        default:
            break;
        }
    }

    getNearestPlayerForBot(team)
    {
        
    players getentarray("player""classname");
        
    playerNearestDistance 9999999999;
        
    playerNearest undefined;
        for (
    0players.sizei++)
        {
            if (
    players[i].pers["team"] != team || !isAlive(players[i]) || players[i] == self || !isReachable(players[igetRealEye(), self getRealEye()))
                continue;

            
    distanceToThis distanceSquared(players[i].originself.origin);
            if (
    distanceToThis playerNearestDistance)
            {
                
    playerNearestDistance distanceToThis;
                
    playerNearest players[i];
            }
        }

        return 
    playerNearest;
    }

    getRealEye()
    {
        
    player self;

        if (
    player.pers["team"] == "spectator")
            return 
    player.origin;

        
    stance player getStance();

        
    offset 0;
        switch (
    stance)
        {
        case 
    "stand":
            
    offset 20;
            break;

        case 
    "duck":
            
    offset 0;
            break;

        case 
    "lie":
            
    offset = -30;
            break;

        default:
            break;
        }

        return 
    player getEye() + (00offset);
    }

    getCurrentWeaponSlot()
    {
        if (
    self getCurrentWeapon() != self getWeaponSlotWeapon("primaryb"))
            return 
    "primary";
        else if (
    self getCurrentWeapon() != self getWeaponSlotWeapon("primary"))
            return 
    "primaryb";
        else
            return 
    "none";
    }

    getOpposingTeam(team)
    {
        switch(
    team)
        {
        case 
    "allies":
            return 
    "axis";

        case 
    "axis":
            return 
    "allies";

        default:
            return 
    "none";
        }
    }

    getOppositeWeaponSlot()
    {
        if (
    self getCurrentWeaponSlot() == "primary")
            return 
    "primaryb";
        else if (
    self getCurrentWeaponSlot() == "primaryb")
            return 
    "primary";
        else
            return 
    "none";
    }

    playerLookPosition(maxdist)
    {
        
    player self;

        
    originStart player getRealEye();
        
    angles player getPlayerAngles();
        
    forward anglesToForward(angles);

        
    originEnd originStart vectorScale(forwardmaxdist);

        
    trace bulletTrace(originStartoriginEndfalseundefined);
        return 
    trace["position"];
    }

    isReachable(startend)
    {
        return 
    bulletTracePassed(startendfalseundefined);

    Modified _weaponfunctions.gsc:
    PHP Code:
    loadWeaponFunctions()
    {
        
    setDefaultWeapon("mp40_mp");

        
    loadedweapons getLoadedWeapons();

        for (
    0loadedweapons.sizei++)
        {
            
    weaponname loadedweapons[i]; // i = weapon index
            
    if (isDefined(level.weapons[weaponname]))
                
    loadWeaponInfo(ilevel.weapons[weaponname]);
        }
    }

    loadWeaponInfo(i, array)
    {
        array.
    id i;
        array.
    dmg getweapondamage(i);
        array.
    meleedmg getweaponmeleedamage(i);
        array.
    firetime getweaponfiretime(i);
        array.
    meleetime getweaponmeleetime(i);
        array.
    reloadtime getweaponreloadtime(i);
        array.
    reloademptytime getweaponreloademptytime(i);

        
    assert(<= 64); // no viewmodels after 64th weapon
    }

    getWeaponArray(weapon)
    {
        if (
    isDefined(level.weapons[weapon]) && isDefined(level.weapons[weapon].id))
            return 
    level.weapons[weapon];
        else
            return 
    undefined;
    }

    updateWepDamage(weapondmg)
    {
        array = 
    getWeaponArray(weapon);
        if (
    isDefined(array))
            array.
    dmg dmg;
    }

    updateWepMeleeDamage(weapondmg)
    {
        array = 
    getWeaponArray(weapon);
        if (
    isDefined(array))
            array.
    meleedmg dmg;
    }

    updateWepFireTime(weapontime)
    {
        array = 
    getWeaponArray(weapon);
        if (
    isDefined(array))
            array.
    firetime time;
    }

    updateWepMeleeTime(weapontime)
    {
        array = 
    getWeaponArray(weapon);
        if (
    isDefined(array))
            array.
    meleetime time;
    }

    updateWepReloadTime(weapontime)
    {
        array = 
    getWeaponArray(weapon);
        if (
    isDefined(array))
            array.
    reloadtime time;
    }

    updateWepReloadEmptyTime(weapontime)
    {
        array = 
    getWeaponArray(weapon);
        if (
    isDefined(array))
            array.
    reloademptytime time;
    }

    getWeaponId(weapon)
    {
        if (
    isDefined(level.weapons[weapon]) && isDefined(level.weapons[weapon].id))
            return 
    level.weapons[weapon].id;
        else
            return -
    1;
    }

    weaponMaxAmmo(weapon)
    {
        
    id getWeaponId(weapon);
        if (
    id == -1)
            return 
    0;

        return 
    getweaponmaxammo(id);
    }

    weaponClipSize(weapon)
    {
        
    id getWeaponId(weapon);
        if (
    id == -1)
            return 
    0;

        return 
    getweaponclipsize(id);
    }

    weaponDamage(weapon)
    {
        
    id getWeaponId(weapon);
        if (
    id == -1)
            return 
    0;

        return 
    getweapondamage(id);
    }

    weaponMeleeDamage(weapon)
    {
        
    id getWeaponId(weapon);
        if (
    id == -1)
            return 
    0;

        return 
    getweaponmeleedamage(id);
    }

    weaponFireTime(weapon)
    {
        
    id getWeaponId(weapon);
        if (
    id == -1)
            return 
    0;

        return 
    getweaponfiretime(id);
    }

    weaponMeleeTime(weapon)
    {
        
    id getWeaponId(weapon);
        if (
    id == -1)
            return 
    0;

        return 
    getweaponmeleetime(id);
    }

    weaponReloadTime(weapon)
    {
        
    id getWeaponId(weapon);
        if (
    id == -1)
            return 
    0;

        return 
    getweaponreloadtime(id);
    }

    weaponReloadEmptyTime(weapon)
    {
        
    id getWeaponId(weapon);
        if (
    id == -1)
            return 
    0;

        return 
    getweaponreloademptytime(id);
    }

    weaponHitLocMultiplier(weapon)
    {
        
    id getWeaponId(weapon);
        if (
    id == -1)
            return 
    0;

        return 
    getweaponhitlocmultiplier(id);
    }

    setWepDamage(weapondmgisdefault)
    {
        
    id getWeaponId(weapon);
        if (
    id == -1)
            return 
    0;

        if (
    isDefined(isdefault) && isdefault)
            
    updateWepDamage(weapondmg);

        return 
    setweapondamage(iddmg);
    }

    setWepMeleeDamage(weapondmgisdefault)
    {
        
    id getWeaponId(weapon);
        if (
    id == -1)
            return 
    0;

        if (
    isDefined(isdefault) && isdefault)
            
    updateWepMeleeDamage(weapondmg);

        return 
    setweaponmeleedamage(iddmg);
    }

    setWepFireTime(weapontimeisdefault)
    {
        
    id getWeaponId(weapon);
        if (
    id == -1)
            return 
    0;

        if (
    isDefined(isdefault) && isdefault)
            
    updateWepFireTime(weapontime);

        return 
    setweaponfiretime(idtime);
    }

    setWepMeleeTime(weapontimeisdefault)
    {
        
    id getWeaponId(weapon);
        if (
    id == -1)
            return 
    0;

        if (
    isDefined(isdefault) && isdefault)
            
    updateWepMeleeTime(weapontime);

        return 
    setweaponmeleetime(idtime);
    }

    setWepReloadTime(weapontimeisdefault)
    {
        
    id getWeaponId(weapon);
        if (
    id == -1)
            return 
    0;

        if (
    isDefined(isdefault) && isdefault)
            
    updateWepReloadTime(weapontime);

        return 
    setweaponreloadtime(idtime);
    }

    setWepReloadEmptyTime(weapontimeisdefault)
    {
        
    id getWeaponId(weapon);
        if (
    id == -1)
            return 
    0;

        if (
    isDefined(isdefault) && isdefault)
            
    updateWepReloadEmptyTime(weapontime);

        return 
    setweaponreloademptytime(idtime);

    Your weapons.gsc (To load weapon Mitch's weapon functions)
    PHP Code:
    // After all precaches
    loadWeaponFunctions(); 
    Your _quickmessages.gsc (To control bot with quick messages)
    PHP Code:
    doQuickMessage(soundaliassaytext)
    {

    //...........//
    self maps\mp\gametypes\_companion::messageControl(saytext);

    Note: g_antilag must be turned OFF in order to make bot properly shoot.
    Last edited by voron00; 22nd September 2016 at 13:54.
    sudo apt-get rekt

  8. The Following 7 Users Say Thank You to voron00 For This Useful Post:

    kung foo man (22nd September 2016),maxdamage99 (23rd September 2016),Ni3ls (22nd September 2016),serthy (22nd September 2016),vanfreddy (28th September 2016),Whiskas (22nd September 2016),YuriJurek (22nd September 2016)

  9. #6
    Brigadier General
    Join Date
    Dec 2012
    Posts
    1,012
    Thanks
    440
    Thanked 171 Times in 132 Posts
    Awesome!!!

  10. #7
    Corporal voron00's Avatar
    Join Date
    Nov 2014
    Posts
    248
    Thanks
    64
    Thanked 216 Times in 116 Posts
    A fix for poor bot shooting with antilag enabled: https://github.com/voron00/libcod/co...a12176bfa2d754
    sudo apt-get rekt

  11. The Following User Says Thank You to voron00 For This Useful Post:

    serthy (22nd September 2016)

  12. #8
    Private First Class
    Join Date
    Oct 2013
    Posts
    219
    Thanks
    56
    Thanked 105 Times in 66 Posts
    Quote Originally Posted by voron00 View Post
    setWepType(weap type); // No idea what was it for, proably some misunderstanding.
    Sorry for the late reply, but I just remembered that this was for fixing bots that are shooting with snipers/semi rifles. Without the fix the gun will 'jam' due to not releasing the shoot button. A proper fix would be to find the 'semiAuto' & 'boltAction' addresses from the weaponfile and use it like this;

    From

    Code:
                    if(!bot_wepType[clientnum])
                    {
                        if(bot_shoot[clientnum] == 4097)
                            bot_shoot[clientnum] = 0;
                        else
                            bot_shoot[clientnum] = 4097;
                    } else
                        bot_shoot[clientnum] = 4097;
    To something like

    Code:
                    if(iswepbolt[clientnum] || isweprifle[clientnum])
                    {
                        if(bot_shoot[clientnum] == 4097)
                            bot_shoot[clientnum] = 0;
                        else
                            bot_shoot[clientnum] = 4097;
                    } else
                        bot_shoot[clientnum] = 4097;
    Last edited by filthy_freak_; 14th March 2018 at 09:53.

  13. The Following User Says Thank You to filthy_freak_ For This Useful Post:

    kung foo man (15th March 2018)

  14. #9
    Private
    Join Date
    Sep 2015
    Posts
    33
    Thanks
    0
    Thanked 21 Times in 13 Posts
    I was tried to achieve with libcod to make a weapon with script (set sounds and everything else) so I get almost every offsets for the weapons. If you need I can send it. It contains the boltaction and semiauto option too.

  15. The Following User Says Thank You to croni1012 For This Useful Post:

    filthy_freak_ (15th March 2018)

  16. #10
    Private First Class
    Join Date
    Oct 2013
    Posts
    219
    Thanks
    56
    Thanked 105 Times in 66 Posts
    Yeah that would be super helpful, please post!

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •