วันเสาร์ที่ 25 มีนาคม พ.ศ. 2560

สกิลกระโดดสสูงตัวละคร !

Code By AlexRedd

//-----------------------------------------------------------//

! ค้นหา ใน AI_Player.cpp !
JumpVelocity = 17;
! วางทับ !

float JumpVelocityForHero = (CurLoadout.HeroItemID == 20174)?30.0f:17.0f; //AlexRedd:: superjump for hero id
JumpVelocity  = JumpVelocityForHero;

float JumpVelocityForHero = (CurLoadout.HeroItemID == 20174)?30.0f:17.0f; //AlexRedd:: superjump for hero id
JumpVelocity  = JumpVelocityForHero;

เวลายาปั้มเลือด

//-----------------------------------------------------------//

# จำไม่ได้ว่าฝั่งไหนหาเอา อยู่แถวนั้นละ
m_BandagesEffectTime = r3dGetTime() + 0.5f;

เปิดปิดลุกหมอบไว



ข้าไปที่ Warz.sln
ค้นหา if(playerState == PLAYER_PRONE_UP || playerState == PLAYER_PRONE_DOWN) { disablePlayerMovement = true; disablePlayerRotation = true; }
เปลี่ยนน จาก true เป็น false เพื่อปิด และ  เปลี่ยนน จาก false เป็น true เพื่อเปิด ตามนี้นะคัฟ

ปรับ EXp

../src/EclipseStudio/Sources/GameCode/UserRewards.cpp

void CGameRewards::InitDefaultRewards()
{
// HERE is COPY-PASTED CODE FROM ExportDefaultRewards()
// USED FOR SERVER

SetReward(1, "ZombieKill", 10, 20, 50, 10);
SetReward(2, "SuperZombieKil", 500, 1000, 1250, 150);
}

500 คือ ID Survivors mode
1000 คือ ID Survivors mode [Premium Account]
1250 กับ 150 น่าจะเป็นของ Hardcore mode
 [โหมดที่สร้างตัวละครมาถ้าตายต้องลบตัวเลยเล่นต่อไม่ได้]

แบนออโต้

-- INSTALL IN WZ_SRV_AddLogInfo --
IF(@in_Msg = 'speedhack')
BEGIN
 IF((SELECT COUNT(*) FROM DBG_SrvLogInfo WHERE CustomerID = @in_CustomerID AND IsProcessed = 0 AND Msg = 'speedhack') >= 5) --  ปรับเอาไอสัตว์วิ่งไวกี่รอบแบน
 BEGIN
 EXEC ADMIN_BanUser @in_CustomerID,'AUTOBAN - SPEED HACK' -- แบนแม่งดิไอสัตว์รอควยไร
 UPDATE DBG_SrvLogInfo SET IsProcessed = 1 WHERE CustomerID = @in_CustomerID AND Msg = 'speedhack' -- เก็บข้อมูลไว้ไอเหี้ยเดี๋ยวพวกมางอแง
 END
END

บังเกอร์ 10 นาที แตก


ค้นหา ใน warz.server.sln
std::vector<obj_ServerBarricade*> obj_ServerBarricade::allBarricades;
แก้เป็นตามนี้นะครับ
const static int BARRICADE_EXPIRE_TIME = 10 * 60;// expire in 10 minutes
const static int STRONGHOLD_EXPIRE_TIME =10 * 60;// expire in 10 minutes
const static int DEV_EVENT_EXPIRE_TIME = 60 * 60; // dev event items will expire in 60 minutes
แล้วก็เสร็จ
แนวทางลงโล่
.

ตัวอย่าง   Itemdb นะครับ

<Weapon itemID="222616" category="28" upgrade="1" FNAME="Item_Riot_Shield_Crate_01_Chilledtreat" Weight="900"  (ให้เอาไฟล์ตรงนี้นะครับ   Item_Riot_Shield_01_Chilledtreat.sco     unfolded="Item_Riot_Shield_01_Chilledtreat.sco">)
<Model file="Data/ObjectsDepot/Weapons/Item_Riot_Shield_Crate_01_Chilledtreat.sco" AnimPrefix="Item_Riot_Shield_Crate_01" muzzlerOffset.x="0" muzzlerOffset.y="0" muzzlerOffset.z="0" />
<MuzzleModel file="" />
<HudIcon file="$Data/Weapons/HudIcons/Item_Riot_Shield_Chilledtreat.dds" />
<Store name="Riot Shield Chilledtreat" icon="$Data/Weapons/StoreIcons/Item_Riot_Shield_Chilledtreat.dds" desc="Its a riot shield! Hide behind it for safety" LevelRequired="0" />
<PrimaryFire bullet="melee" damage="400" immediate="true" mass="10" decay="1" speed="45" area="0" delay="0" timeout="0" numShells="1" clipSize="5" reloadTime="1" activeReloadTick="0" rateOfFire="60" spread="1" recoil="1" numgrenades="0" grenadename="asr_grenade" firemode="100" ScopeType="default" ScopeZoom="0" /> <Animation type="assault" /> <Sound shoot="" reload="" />
<FPS IsFPS="1" i0="0" i1="0" i2="0" i3="0" i4="0" i5="0" i6="0" i7="0" i8="0" d0="0" d1="0" d2="0" d3="0" d4="0" d5="0" d6="0" d7="0" d8="0" />
</Weapon>

ตรวจสอบความเข้าใจก่อนทำนะครับ


คำเตือน  !   ค่อยๆๆทำ ทำความเข้าใจไปด้วย  แล้วเซ็กดีๆๆๆ    
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----WarZserver------


1.codeค้นหา
else if(m_ItemID == WeaponConfig::ITEMID_RiotShieldBarricade || m_ItemID==WeaponConfig::ITEMID_RiotShieldBarricadeZB)
เพิ่ม
else if(m_ItemID == WeaponConfig::ITEMID_RiotShieldBarricade1)
{
FileName = "Data\\ObjectsDepot\\Weapons\\Item_Riot_Shield_01_Chilledtreat.sco";    <----- มาใส่ตรงนี้     Item_Riot_Shield_01_Chilledtreat.sco
bsize    = r3dPoint3D(1.726829f, 2.136024f, 0.762201f);
}


2.codeค้นหา    
case WeaponConfig::ITEMID_RiotShieldBarricade:
เพิ่ม
case WeaponConfig::ITEMID_RiotShieldBarricade9:      เลข9 คือจำนวนของโล่อย่าให้ซ้ำกันนะครับ    แล้วแต่ซอสว่าตัวสุดท้ายคือเลขอะไรแล้วก็เพิ่มตัวเลขล่าสุดลงไป




3.codeค้นหา  
ITEMID_RiotShieldBarricade
เพิ่ม                                                        
ITEMID_RiotShieldBarricade9 = 222968,                เพิ่ม  id item ของโล่ลงไป     ..... เลข9 คือจำนวนของโล่อย่าให้ซ้ำกันนะครับ    แล้วแต่ซอสว่าตัวสุดท้ายคือเลขอะไรแล้วก็เพิ่มตัวเลขล่าสุดลงไป





4.codeค้นหา
bool isBarricade = usedItemId==WeaponConfig::ITEMID_BarbWireBarricade||usedItemId==WeaponConfig::ITEMID_WoodShieldBarricade||usedItemId==WeaponConfig::ITEMID_WoodShieldBarricadeZB||
เพิ่ม
usedItemId==WeaponConfig::ITEMID_RiotShieldBarricade9||usedItemId==WeaponConfig::ITEMID_RiotShieldBarricade10||  (ไม่มีเว้นวรรค)    เลข9 คือจำนวนของโล่อย่าให้ซ้ำกันนะครับ    แล้วแต่ซอสว่าตัวสุดท้ายคือเลขอะไรแล้วก็เพิ่มตัวเลขล่าสุดลงไป
                                                                                                                                                     ไม่มีเว้นวรรค)



---------------WarZ----------------
1.code ค้นหา
if(m_needToDrawBarricadePlacement == WeaponConfig::ITEMID_BarbWireBarricade)
เพิ่ม
else if(m_needToDrawBarricadePlacement == WeaponConfig::ITEMID_RiotShieldBarricade9)     เลข9 คือจำนวนของโล่อย่าให้ซ้ำกันนะครับ    แล้วแต่ซอสว่าตัวสุดท้ายคือเลขอะไรแล้วก็เพิ่มตัวเลขล่าสุดลงไป
m_BarricadeMeshPlacement = r3dGOBAddMesh("Data\\ObjectsDepot\\Weapons\\Item_Riot_Shield_Crate_01_Australia.sco", true, false, true, true );



2.codeค้นหา
if(m_ItemID == WeaponConfig::ITEMID_BarbWireBarricade)
เพิ่ม
else if(m_ItemID == WeaponConfig::ITEMID_RiotShieldBarricade9)       เลข9 คือจำนวนของโล่อย่าให้ซ้ำกันนะครับ    แล้วแต่ซอสว่าตัวสุดท้ายคือเลขอะไรแล้วก็เพิ่มตัวเลขล่าสุดลงไป
m_PrivateModel = r3dGOBAddMesh("Data\\ObjectsDepot\\Weapons\\Item_Riot_Shield_01_Gal.sco", true, false, true, true );








3.code ค้นหา
case WeaponConfig::ITEMID_RiotShieldBarricade
เพิ่ม
case WeaponConfig::ITEMID_RiotShieldBarricade9:  อันนี้จะลง3จุดนะครับเซ็กดีๆๆ        เลข9 คือจำนวนของโล่อย่าให้ซ้ำกันนะครับ    แล้วแต่ซอสว่าตัวสุดท้ายคือเลขอะไรแล้วก็เพิ่มตัวเลขล่าสุดลงไป


4.code ค้นหา
if(n.itemID == WeaponConfig::ITEMID_BarbWireBarricade ||
เพิ่ม
n.itemID == WeaponConfig::ITEMID_RiotShieldBarricade9 ||        เลข9 คือจำนวนของโล่อย่าให้ซ้ำกันนะครับ    แล้วแต่ซอสว่าตัวสุดท้ายคือเลขอะไรแล้วก็เพิ่มตัวเลขล่าสุดลงไป


5.codeค้นหา
if(wi.itemID == WeaponConfig::ITEMID_BarbWireBarricade ||
เพิ่ม
 wi.itemID == WeaponConfig::ITEMID_RiotShieldBarricade9 ||       เลข9 คือจำนวนของโล่อย่าให้ซ้ำกันนะครับ    แล้วแต่ซอสว่าตัวสุดท้ายคือเลขอะไรแล้วก็เพิ่มตัวเลขล่าสุดลงไป



6.codeค้นหา
if(wpn->getItemID() == WeaponConfig::ITEMID_BarbWireBarricade ||
 เพิ่ม
wpn->getItemID() == WeaponConfig::ITEMID_RiotShieldBarricade9 ||    เลข9 คือจำนวนของโล่อย่าให้ซ้ำกันนะครับ    แล้วแต่ซอสว่าตัวสุดท้ายคือเลขอะไรแล้วก็เพิ่มตัวเลขล่าสุดลงไป










ทำตัวละคร สกิวรีเลือด

หา
loadout_->Health -= d;
เพิ่ม
if(loadout_->HeroItemID==20219)
{
float HPregen = 1.0f;
HPregen *= 20.2f;
loadout_->Health += timePassed*HPregen;
loadout_->Health = R3D_MIN(loadout_->Health, 100.0f);
}


float HPregen = 1.0f; = ความเร็วในการโหลดต่อครั้ง เช่นปรับ 2 ขึ้นทีละ 2
HPregen *= 20.2f; = ความเร็ว เป็นการเร่งความเร็วการโหลด คิดเปอร์เซ็นคูณจากความเร็วเดิม

ดูดของทะลุสิ่งกีดขวาง

WArZ.sln
หา
if(selectHumans)
ข้างบนนิดนึง
จะเจอ

if(!isVisible)

continue;

ให้ปิดตามนี้
//if(!isVisible)

//continue;

ดรอปบอสหลายชิ้น

// drop loot
    if(!fakeDeath && spawnObject->lootBoxCfg)
    {
        int HowManyToDrop = 1;
        if( IsSuperZombie()) HowManyToDrop = 5;

ซื้อเกิเสีย GC

ALTER PROCEDURE [dbo].[WZ_CharReviveCheck]
@in_CustomerID int,
@in_CharID int
AS
BEGIN
SET NOCOUNT ON;

-- validate CharID/CustomerID pair
declare @CustomerID int = 0
select @CustomerID=CustomerID from UsersChars where CharID=@in_CharID
if(@@ROWCOUNT = 0 or @CustomerID <> @in_CustomerID) begin
select 6 as ResultCode, 'bad charid' as ResultMsg
return
end

-- change server revive time in WZ_GetAccountInfo2/WZ_Revive/WZ_ReviveCheck as well
declare @SecToRevive int
declare @Alive int = 1
select
@SecToRevive=DATEDIFF(second, GETUTCDATE(), DATEADD(minute, 20, DeathUtcTime)),
@Alive=Alive
from UsersChars where CharID=@in_CharID

-- premium accs have 10min revive time
declare @PremiumExpireTime datetime
select @PremiumExpireTime=PremiumExpireTime from UsersData where CustomerID=@in_CustomerID
if(GETDATE() < @PremiumExpireTime) begin
set @SecToRevive = @SecToRevive - 600
end

select 0 as ResultCode

-- check if we need money for revive
declare @NeedMoney int = 0
if(@SecToRevive > 61 and @Alive = 0) set @NeedMoney = 1

select @SecToRevive as 'SecToRevive', @NeedMoney as 'NeedMoney'

END

ซ่อนกระเป๋า

จำไม่ได้นะว่าอยู่ใน warz.sln รึป่าวน่าจะใช่

ค้นหา

if(strncmp(s_chatMsg, "/stime", 6) == NULL)
{
char buf[256];
int hour, min;
if(3 != sscanf(s_chatMsg, "%s %d %d", buf, &hour, &min))
{
addChatMessage(0, "<System>", "/stime {hour} {min}", 0);
return;
}

วางไว้ข้างบนหาที่ โล่งๆจัด ให้ดีๆไม่ยากหรอก ต้องลองเอาจะได้เข้าใจจจ
//MZ
if(strncmp(s_chatMsg, "/bk" , 9) == NULL)
{
d_disable_backpacks_draw->SetBool(!d_disable_backpacks_draw->GetBool());
return;
}

ปล. ตรง /bk แล้วแต่ท่านนะคับจะเปลี่ยน ยังไง อะไรก็ช่าง จะเป็น /backpack ก็ต้องพิมพ์ ตามที่ ตั้งไว้ มันถึงจะซ่อน ไม่เข้าใจ ทำไรไม่ได้ ถามมม เอาไปโมได้ โมเทพเอามาแบ่งด้วย

โชว์ดาบ เวลาเก้บ

WarZ.sln :
ค้นหา
void CUberEquip::DrawSlot(ESlot slotId, const D3DXMATRIX& world, DrawType dt, bool skin, bool draw_firstperson, const r3dSkeleton* wpnSkeleton)
ใส่ // :
{
//if(slotId == SLOT_WeaponSide)
//return;
if(draw_firstperson)
{
if(slotId == SLOT_Armor || slotId == SLOT_LowerBody || slotId == SLOT_Head || slotId == SLOT_Helmet || slotId == SLOT_Backpack)
return;
}
ค้นหา :
if(slots_[SLOT_WeaponSide].wpn)
ทับ :
if(slots_[SLOT_WeaponSide].wpn)
{
if(slots_[SLOT_WeaponSide].wpn->getCategory() == storecat_HG) // Rolor:put handguns in side slot
{
skel->GetBoneWorldTM("Weapon_Side", &world, CharMat);
}
else if(slots_[SLOT_WeaponSide].wpn->getCategory() == storecat_MELEE) // Rolor:it is a melee weapon, put it on back but rotate it to look better (for most)
{
D3DXMATRIX mr1;
D3DXMatrixRotationYawPitchRoll(&mr1, 0, R3D_PI/2 + 40, 30);
skel->GetBoneWorldTM("Weapon_Side", &world, CharMat);
world = mr1 * world;
}
else // Rolor:it is not handgun or melee, put it on back
{
skel->GetBoneWorldTM("Weapon_Side", &world, CharMat);
}

ชื่อหล่อ

\src\Scripts\WZBackend-ASP.NET\Site\api_CharSlots.aspx.cs
หา bool CheckCharName2(string Gamertag)
แก้ char[] AllowedChars = "0123456789abcdefghijklmnopqrstuvwxyz".ToCharArray();
เป็น char[] AllowedChars = "0123456789abcdefghijklmnopqrstuvwxyzกขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮะาิีึืุูเแโัำไใฤฦ่้๊๋์๐ฯ็ฺ,ํๅ๑๒๓๔๕๖๗๘๙๐฿".ToCharArray();

ของไม่พัง

Var3 = R3D_CLAMP(Var3, 0, (int)MAX_DURABILITY);
เปลี่ยนเป็น
Var3 = 10000;

แก้พวกดิสแล้วบัค

WarZ_Server.sln

ServerGameLogic.cpp

ค้นหา

if(loadout.GameMapId && (loadout.GameMapId == ginfo_.mapId) && loadout.Alive == 1)
    {
        *pos = loadout.GamePos;
        *dir = loadout.GameDir;
        //r3dOutToLog("alive at position %f %f %f\n", pos->x, pos->y, pos->z);
        return;
}

แก้ไข

/*if(loadout.GameMapId && (loadout.GameMapId == ginfo_.mapId) && loadout.Alive == 1)
    {
        *pos = loadout.GamePos;
        *dir = loadout.GameDir;
        //r3dOutToLog("alive at position %f %f %f\n", pos->x, pos->y, pos->z);
        return;
    }*/

ค้นหา

if(loadout.GameMapId && loadout.Alive == 2)
    {
        GetSpawnPositionAfterDeath(loadout.GamePos, pos, dir);
        // move spawn pos at radius
        pos->x += u_GetRandom(-_glm_SpawnRadius, _glm_SpawnRadius);
        pos->z += u_GetRandom(-_glm_SpawnRadius, _glm_SpawnRadius);
        //r3dOutToLog("revived at position %f %f %f\n", pos->x, pos->y, pos->z);
        return;
    }

แก้ไข

if(loadout.GameMapId && loadout.Alive == 1 || loadout.Alive == 2)
    {
        GetSpawnPositionAfterDeath(loadout.GamePos, pos, dir);
        // move spawn pos at radius
        pos->x += u_GetRandom(-_glm_SpawnRadius, _glm_SpawnRadius);
        pos->z += u_GetRandom(-_glm_SpawnRadius, _glm_SpawnRadius);
        //r3dOutToLog("revived at position %f %f %f\n", pos->x, pos->y, pos->z);
        return;
    }

การเพิ่มตู้เซฟ

?#?การเพิ่มตู้เซฟ? Lockbox
?#?ค้นหา? WarZ_Server.sln
class WeaponConfig : public ModelItemConfig
{
private:
mutable r3dMesh* m_Model_FPS;
mutable int m_ModelRefCount ;
?#?มองหา?
ITEMID_Lockbox = 101348,
?#?เพิ่ม?
ITEMID_Lockbox1 = เลขไอเทมใหม่,
หมายเหตุ Lockbox1 ตั่งตามชื่อไอเทมได้ เช่น LockboxDell
--------------------------------------------------------
ส่วนที่ 2
#ค้นหา WarZ_Server.sln
BOOL obj_ServerLockbox::OnCreate()
{
r3dOutToLog("obj_ServerLockbox[%d] created. ItemID:%d numItems:%d OwnerID:%d\n", srvObjParams_.ServerObjectID, m_ItemID, items.size(), srvObjParams_.CustomerID);
// set FileName based on itemid for ReadPhysicsConfig() in OnCreate()
r3dPoint3D bsize(1, 1, 1);
#มองหา
else if(m_ItemID == WeaponConfig::ITEMID_Lockbox1)
{
FileName = "Data\\ObjectsDepot\\Weapons\\Item_Lockbox_01_NV.sco";
}
?#?เพิ่มตามตัวอย่างที่มีอยู่แล้ว? ตัวอย่างเช่น
else if(m_ItemID == WeaponConfig::ITEMID_Lockbox2)
{
FileName = "Data\\ObjectsDepot\\Weapons\\Item_Lockbox_01_TM.sco";
}
---------------------------------------------------------------------------------
?#?ส่วนที่? 3
#ค้นหา WarZ_Server.sln
bool isBarricade = usedItemId==WeaponConfig::ITEMID_BarbWireBarricade
#เพิ่ม
usedItemId==WeaponConfig::ITEMID_Lockbox?? ||
ตามต้องการ
------------------------------------------------------------------
ส่วนที่ 4
#ค้นหา WarZ_Server.sln
case WeaponConfig::ITEMID_SolarWaterPurifier:
return UseItem_FarmBlock(n.pos, n.var1, itemID);
#มองหา
case WeaponConfig::ITEMID_Lockbox:
เพิ่มตามต้องการ
case WeaponConfig::ITEMID_Lockbox??:
------------------------------------------------------------------
ส่วนที่ 5
#ค้นหา WarZ_Server.sln
// check weight
const BaseItemConfig* itemCfg = g_pWeaponArmory->getConfig(WeaponConfig::ITEMID_Lockbox);
if(lockbox->GetNetworkHelper()->srvObjParams_.ItemID == WeaponConfig::ITEMID_Lockbox)
#มองหา
else if(lockbox->GetNetworkHelper()->srvObjParams_.ItemID == WeaponConfig::ITEMID_Lockbox1)
{
const BaseItemConfig* itemCfg = g_pWeaponArmory->getConfig(WeaponConfig::ITEMID_Lockbox1);
}
เพิ่มตามต้องการ
else if(lockbox->GetNetworkHelper()->srvObjParams_.ItemID == WeaponConfig::ITEMID_Lockbox??)
{
const BaseItemConfig* itemCfg = g_pWeaponArmory->getConfig(WeaponConfig::ITEMID_Lockbox??);
}
-------------------------------------------------------------------------------
ส่วนที่ 6
#ค้นหา WarZ.sln
// consumables
if(InputMappingMngr->wasReleased(r3dInputMappingMngr::KS_PRIMARY_FIRE) || m_ItemSimulateLeftClick)
#มองหา
wpn->getItemID() == WeaponConfig::ITEMID_Lockbox ||
?#?เพิ่มตามต้องการ?
wpn->getItemID() == WeaponConfig::ITEMID_Lockbox?? ||
-------------------------------------------------------------------------------------
ส่วนที่ 7
#มองหา
if(wpn->getItemID() == WeaponConfig::ITEMID_BarbWireBarricade ||
#เพิ่มตามต้องการ
wpn->getItemID() == WeaponConfig::ITEMID_Lockbox?? ||
-------------------------------------------------------------------------------------
ส่วนที่ 8
#ค้นหา WarZ.sln
bool needCorrectPos = false; // those objects require precise position, otherwise there will be desync between client\server (mainly spawn beacon problem)
if(wi.itemID == WeaponConfig::ITEMID_BarbWireBarricade ||
#มองหา
wi.itemID == WeaponConfig::ITEMID_Lockbox ||
#เพิ่มตามต้องการ
wi.itemID == WeaponConfig::ITEMID_Lockbox?? ||
-------------------------------------------------------------------------------
ส่วนที่ 9
#ค้นหา WarZ.sln
if(m_needToDrawBarricadePlacement)
{
if(m_BarricadeMeshPlacement == NULL)
{
m_BarricadeMeshAllowToPlaceOnTop = false;
if(m_needToDrawBarricadePlacement == WeaponConfig::ITEMID_BarbWireBarricade)
#มองหา
else if(m_needToDrawBarricadePlacement == WeaponConfig::ITEMID_Lockbox)
m_BarricadeMeshPlacement = r3dGOBAddMesh("Data\\ObjectsDepot\\Weapons\\Item_Lockbox_01.sco", true, false, true, true );
#เพิ่มตามต้องการ
else if(m_needToDrawBarricadePlacement == WeaponConfig::ITEMID_Lockbox??)
m_BarricadeMeshPlacement = r3dGOBAddMesh("Data\\ObjectsDepot\\Weapons\\Item_Lockbox_??.sco", true, false, true, true );
--------------------------------------------------------------------------
ส่วนที่ 10
#ค้นหา WarZ.sln
// check if we can place our riot shield. I don't want to do this in update, as anyway this function is called every frame, so should be fine(
{
PxBoxGeometry bbox(m_BarricadeMeshPlacement->localBBox.Size.x*0.5f, m_BarricadeMeshPlacement->localBBox.Size.y*0.5f, m_BarricadeMeshPlacement->localBBox.Size.z*0.5f);
#มองหา
if(m_needToDrawBarricadePlacement == WeaponConfig::ITEMID_Lockbox ||
#เพิ่มตามต้องการ
m_needToDrawBarricadePlacement == WeaponConfig::ITEMID_Lockbox?? ||
----------------------------------------------------------------------------
ส่วนที่11
#ค้นหา WarZ.sln
BOOL obj_Safelock::OnCreate()
{
r3d_assert(m_ItemID > 0);
const char* cpMeshName = "";
#มองหา
if(m_ItemID == WeaponConfig::ITEMID_Lockbox)
cpMeshName = "Data\\ObjectsDepot\\Weapons\\Item_Lockbox_01.sco";
เพิ่มตามต้องการ ตัวอย่าง
if(m_ItemID == WeaponConfig::ITEMID_Lockbox1)
cpMeshName = "Data\\ObjectsDepot\\Weapons\\Item_Lockbox_01_NV.sco";
-------------------------------------------------------------------------------
ส่วนที่ 12
#ค้นหา WarZ.sln
else if(wi.itemID == WeaponConfig::ITEMID_BarbWireBarricade ||
wi.itemID == WeaponConfig::ITEMID_WoodShieldBarricade ||
#มองหา
wi.itemID == WeaponConfig::ITEMID_Lockbox ||
เพิ่มตามต้องการ
wi.itemID == WeaponConfig::ITEMID_Lockbox?? ||
-------------------------------------------------------------------------------
ส่วนที่ 13
#ค้นหา WarZ.sln
obj_Safelock* safelock= (obj_Safelock*)srv_CreateGameObject("obj_Safelock", "safelock", n.pos);
#มองหา ด้านบน
n.itemID == WeaponConfig::ITEMID_Lockbox1 ||
เพิ่มตามต้องการ
n.itemID == WeaponConfig::ITEMID_Lockbox?? ||

กันโปรวิ่ง + บิน

SEARCH FOR: WarZ.sln
Code:
m_ReticleTargetScale = R3D_MIN(1.0f + spread, 12.0f);

    // update reload anim
    if(wpn->isReloading())
    {
        uberAnim_->StartReloadAnim();
    }
    else
    {
        uberAnim_->StopReloadAnim();
    }
Add Bellow
Code:
//DouglasPRO :: JUST TESTING !!
   if(PlayerState == PLAYER_IDLE){
        if(plr_local_Velocity.Z >= 1.5){
            if(PlayerState == PLAYER_IDLE){
                r3dOutToLog("WARNING : ERROR 101-A");
                extern bool gKillFlag;
                if(!gUserProfile.ProfileData.isDevAccount){//AlphaMMO A.C AGAINST SPEED HACK
                gKillFlag  = true;
                }
            }
        }
    }
   if(PlayerState == PLAYER_MOVE_RUN){
        if(plr_local_Velocity.Z >= 3.5){
            if(PlayerState == PLAYER_MOVE_RUN){
                r3dOutToLog("WARNING : ERROR SPEED HACK FOUND-B");
                if(!gUserProfile.ProfileData.isDevAccount){//AlphaMMO A.C AGAINST SPEED HACK
                extern bool gKillFlag;
                gKillFlag  = true;
                }
            }
        }
    }


   //ANTI JUMP
      if(JumpVelocity){
        if(JumpVelocity/*.Z*/ >= 22){
            if(PlayerState == PLAYER_MOVE_RUN){
                r3dOutToLog("WARNING : ERROR JUMP HACK FOUND -A");
                if(!gUserProfile.ProfileData.isDevAccount){//AlphaMMO A.C AGAINST JUMP HACK DouglasPRO
                extern bool gKillFlag;
                gKillFlag  = true;
                }
            }
        }
    }
    //DouglasPRO :: JUST TESTING !!
    //ANTI DEBUG
    if(IsDebuggerPresent()){
            r3dOutToLog("WARNING : DEBUG FOUND -C");
            extern bool gKillFlag;
            if(!gUserProfile.ProfileData.isDevAccount){//AlphaMMO A.C DEBUG CANCEL
            gKillFlag  = true;
            }
    }
   
    if(bOnGround){
        if(plr_local_Velocity.Z >= 4.5){
            r3dOutToLog("WARNING : ERROR SPEED HACK FOUND-C");
            extern bool gKillFlag;
            if(!gUserProfile.ProfileData.isDevAccount){//AlphaMMO A.C AGAINST SPEED HACK
            gKillFlag  = true;
            }
        }
    }  


    VMPROTECT_End();
}

กด i กด Tap เดินได้ ดิสเดินไม่ได้ ทดสอบ 100%

ก่อนทำอะรัยควรศึกษาก่อนนะครับ เพื่อมิให้เป็นปัญหากับคนที่แก้
แจก ไม่ใช่เอาไปขายกันอีกนะครับ
หมายเหตุ :: คนที่ทำไปแล้วก่อนหน้า ให้ย้อนกลับด้วยนะครับเพราะอันเดิมต้องเอาออกก่อน เพราะคนละฟั่งชั่นกัน
?#?ค้นหา? HUDPause.cpp
void HUDPause::eventQuitGame(r3dScaleformMovie* pMovie, const Scaleform::GFx::Value* args, unsigned argCount)
{
?#?ifndef? FINAL_BUILD
d_navmesh_debug->SetBool(false);
?#?endif? // FINAL_BUILD
// send disconnect request to server
PKT_C2S_DisconnectReq_s n;
p2pSendToHost(gClientLogic().localPlayer_, &n, sizeof(n), true);
if(!gClientLogic().localPlayer_->bDead)
DisconnectAt = r3dGetTime() + 10.0f;
else
DisconnectAt = r3dGetTime();
?#?เพิ่มด้านล่าง?
isDisconnecting_ = true;
---------------------------------------------------
#ค้นหา HUDPause.cpp
gfxMovie.RegisterEventHandler("eventMissionAbandon", MAKE_CALLBACK(eventMissionAbandon));
gfxMovie.RegisterEventHandler("eventMissionRequestList", MAKE_CALLBACK(eventMissionRequestList));
gfxMovie.SetCurentRTViewport( Scaleform::GFx::Movie::SM_ExactFit );
AllowItemDropAfterThisTime = 999999999999999.0f;
disableHotKeys = false;
#เพิ่มด้านล่าง
isDisconnecting_ = false;
------------------------------------------------
#ค้นหา HUDPause.h
void eventMissionRequestList(r3dScaleformMovie* pMovie, const Scaleform::GFx::Value* args, unsigned argCount);
void AddSettingsChangeFlag( DWORD flag );
void SetNeedUpdateSettings();
void setAllowItemDropTime(float time) { AllowItemDropAfterThisTime = time; }
int m_waitingForKeyRemap;
#เพิ่มด้านล่าง
bool isDisconnecting_;
---------------------------------------
#ค้นหา
class HUDPause
{
bool isActive_;
bool isInit;
float DisconnectAt; // time
float AllowItemDropAfterThisTime;
?#?มองหา? bool disableHotKeys;
?#?และปิด? //bool disableHotKeys;
----------------------------------------------------
#ค้นหา
void setMissionInfo(uint32_t BtnIdx, bool isDeclined, bool isAccepted, const char* MissionName, const char* MissionDesc, const char* MissionIcon, uint32_t missionID);
public:
HUDPause();
~HUDPause();
bool Init();
bool Unload();
#เพิ่มด้านล่าง
bool disableHotKeys;
------------------------------------------------------------------------
#ค้นหา HUD_TPSGame.cpp
Mouse->GetMouseVisibility() || (hudMain && (hudMain->isChatInputActive() || hudMain->isPlayersListVisible()))) // do not update player if we are in menu control mode!
{
disablePlayerMovement = true;
disablePlayerRotation = true;
}
if(pl->bDead)
return;
#เพิ่มด้านล่าง
//TheHexa:: Simple logic for player move when pause hud are activated.
//TheHexa:: CrashRPT here, studio crashing when spawn character on editor. FIXED!
?#?ifdef? FINAL_BUILD
if(disablePlayerMovement && (hudPause->isActive() || hudMain->isPlayersListVisible() || hudCraft->isActive() || hudAttm->isActive())) //TheHexa:: Players disconnecting can't move anymore
{
if(!hudPause->disableHotKeys && !hudPause->isDisconnecting_)
{
disablePlayerMovement = false;
}
else
{
disablePlayerMovement = true;
}
}
?#?else?
if(!g_bEditMode)
{
if(disablePlayerMovement && (hudPause->isActive() || hudMain->isPlayersListVisible())) //TheHexa:: Players disconnecting can't move anymore
{
if(!hudPause->disableHotKeys && !hudPause->isDisconnecting_)
{
disablePlayerMovement = false;
}
else
{
disablePlayerMovement = true;
}
}
}
#endif

ตัวละคร Zomby

ตัวละคร Zomboy :: ป้องกันการโจมตีจากซอมบี้ (ปล.ถ้าไปยิงมันจะตี หยุดยิงไม่ตี)
WarZ_Server
#ค้นหา sobj_Zombie.cpp
bool obj_Zombie::IsPlayerDetectable(const obj_ServerPlayer* plr, float distSq)
#มองหา
if(plr->m_isAdmin_GodMode)
return false;
#เพิ่มด้านล่าง
if(plr->loadout_->HeroItemID == 20223)
return false;

ระบบบอกจำนวนคนออนไลน์ในแมพ

แบบระบุแมพนะครับ ใครจะเอาไปประยุกต์ยังงั้ยก้อตามสะดวกเลยทดสอบแล้วใช้งานได้ 100%
#ค้นหา UserProfile.h
struct wiUserProfile
{
enum DEV_ACCOUNT_ACCESS
{
DAA_ENABLED = 1<<0, // legacy, shouldn't be used
DAA_DEV_ICON = 1<<1, // dev icon in player list, red text in chat
DAA_TELEPORT = 1<<2, // can teleport or teleport to player, or get player location
DAA_SPAWN_ITEM = 1< , // can spawn items via /gi command
DAA_KICK = 1<<4, // can kick players from server
DAA_BAN = 1<<5, // can permanently ban ppl
DAA_GOD = 1<<6, // can enable god mode
DAA_INVISIBLE = 1<<7, // player model is totally invisible!
DAA_HIDDEN = 1<<8, // do not show up in player list
};
uint32_t isDevAccount;
uint32_t TimePlayed; // account time played (not char!), in seconds
int PremiumAcc; // if more than 0 - time in minutes until premium account expiration
// 0 - legend, 1 - pioneer, 2 - survivor, 3 - guest
// 4 - 15$, 5-25$, 6-50$
// 10 - steam
// 50-53 - RU
// 20-29 - trial account (20-us, 21-ru)
int AccountType;
int GamePoints;
int GameDollars;
int ResWood;
int ResStone;
int ResMetal;
#เพิ่มด้านล่าง
bool isGameHardcore; //gamehardcore
int HardMaxPlayers;//gamehardcore
#ค้นหา AI_Player.H
float TimeOfLastRespawn;
int Dead_KillerID; // killer ID of a person who killed you
bool DisableKillerView; // if user clicks on a mouse, show respawn right away
bool bCrouch;
bool bProne;
#เพิ่มด้านล่าง
bool isGameHardcore; //gamehardcore
int HardMaxPlayers; //gamehardcore
#ค้นหา
footsteps_timeSinceLastMissingHitResult = 0;
lastTradeRequestedFrom = 0;
lastTimeUsedConsumable = -99999.0f;
currentConsumableCooldownTime = 0;
m_needToDrawBarricadePlacement = 0;
m_BarricadeMeshPlacement = NULL;
m_canPlaceConsumableItem = false;
m_SpeedBoost = 0;
m_SpeedBoostTime = 0;
m_MorhineShotTime =0;
m_BandagesEffectTime = 0;
CurrentSpread = 0;
#เพิ่มด้านล่าง (mapId==12 คือแมพที่จะให้มีโชว์คนออนไลน์)
isGameHardcore = gClientLogic().m_gameInfo.mapId==12?true:false;//gamehardcore
HardMaxPlayers = gClientLogic().m_gameInfo.maxPlayers;//gamehardcore
#ค้นหา AI_Player.CPP
void obj_Player::DrawLabel()
{
r3dRenderer->SetMaterial(NULL);
struct PushRestoreStates
{
PushRestoreStates()
{
r3dRenderer->SetRenderingMode( R3D_BLEND_ALPHA | R3D_BLEND_NZ | R3D_BLEND_PUSH );
}
~PushRestoreStates()
{
r3dRenderer->SetRenderingMode( R3D_BLEND_POP );
}
} pushRestoreStates; (void)pushRestoreStates;
if(NetworkLocal && gClientLogic().localPlayer_)
{
#เพิ่มด้านล่าง
if(gClientLogic().m_gameInfo.channel==2)
{
int Players = 0;
for( GameObject* obj = GameWorld().GetFirstObject(); obj; obj = GameWorld().GetNextObject(obj) )
{
if(obj->isObjType(OBJTYPE_Human))
{
Players++;
}
}
char text[512];
sprintf(text,"Players Online: %i Missing: %i", Players,HardMaxPlayers-Players);
Font_Label->PrintF((r3dRenderer->ScreenW/2)-(strlen(text)+50), 0, r3dColor(243,43,37), "%s", text);
}


แก้ไข if (isGameHardcore == true) //gamehardcore
เป็น if(gClientLogic().m_gameInfo.channel==2)

จะสารมารถให้สามารถโชว์ได้ให้ แมพที่อยุ่ใน channel2 คือแมพปกติที่ใช้กัน

1 ห้องบิงกินเนอร์
2. ห้องปกติ
4. ห้องพรีเมี่ยม

ทำID พรีเมี่ยมถึกขึ้น15%

obj_ServerPlayer.cpp
#ค้นหา
// Increased health 1
if(loadout_->Skills[CUserSkills::SKILL_Physical1])
damage *= 0.95f;
เพิ่มด่างล่าง
/////////////////เพิ่มถึก15%//////////////////////////////Start
if (profile_.ProfileData.PremiumAcc)
{
damage *= 0.75f;
}
/////////////////เพิ่มถึก15%//////////////////////////////End
#ค้นหา
// Increased health 2
if(loadout_->Skills[CUserSkills::SKILL_Physical8])
damage *= 0.9f;
เพิ่มด้านล่าง
/////////////////เพิ่มถึก15%//////////////////////////////Start
if (profile_.ProfileData.PremiumAcc)
{
damage *= 0.75f;
}
/////////////////เพิ่มถึก15%//////////////////////////////End
หมายเหตุ:: สามารถแก้ไขความถึกได้ที่นี้ damage *= ?? ยิ่งน้อยยิ่งถึก

สีของตกพื้น

เผื่อใครเบื่อสี ของตกพื้น เปลี่ยนเอาเลย
#การเปลี่ยนสีกรอบไอเทม สีของตกพื้น
obj_DroppedItem.cpp
Search
void obj_DroppedItemAppendRenderables( RenderArray ( & render_arrays )[ rsCount ], const r3dCamera& Cam )
---------------------------------
มองหาและแก้ไขตามกรอบแดง
rend.Init( MeshGameObjectGetObjectLodMesh(), this, r3dColorblue.GetPacked() );
--------------------------------------------
yellowblack
grey;
white
red
green
blue
orange
เครดิต ท่านเอ

ยิ่งหัวเป้าแดง ดูดีๆนะ

ไฟล์เป้า เอาไปว่าง bin/data/weapons/hitmarker.dds
https://drive.google.com/file/d/0B1mr-qG-LpkEbkctVllveDNvZk0/view?usp=sharing
//////////////////////////////////////////////////////////////////////////////////////////


WarZ.sln
หา
float        m_HitMarkerFadeout;
r3dTexture*    m_HitMarkerTex; // only for local player

int m_HitMarkerType;
r3dTexture* m_HitMarkerHeadTex; // only for local player


m_HitMarkerFadeout = 0;
m_HitMarkerTex = NULL;

m_HitMarkerType = 0;
m_HitMarkerHeadTex = NULL;


m_HitMarkerTex = r3dRenderer->LoadTexture("data/weapons/hitmarker.dds", D3DFMT_UNKNOWN, false, 1, 0, D3DPOOL_MANAGED, PlayerTexMem );
r3d_assert(m_HitMarkerTex != NULL);


m_HitMarkerHeadTex = r3dRenderer->LoadTexture("data/weapons/hitmarkerheadshot.dds", D3DFMT_UNKNOWN, false, 1, 0, D3DPOOL_MANAGED, PlayerTexMem );
r3d_assert(m_HitMarkerHeadTex != NULL);

if(!trgt->bDead && ownerPlayer)
{
   ownerPlayer->m_HitMarkerFadeout = 1.0f;
}

if(!trgt->bDead && ownerPlayer)

{
    int isHeadShot = strcmp("Bip01_Head", hitActorName) == 0 ? 1:0;
    ownerPlayer->m_HitMarkerType = (isHeadShot);
    ownerPlayer->m_HitMarkerFadeout = 1.0f;
}

if(m_HitMarkerFadeout>0)

{
        float rw = (float)m_HitMarkerTex->GetWidth();
        float rh = (float)m_HitMarkerTex->GetHeight();
        r3dColor clr = r3dColor::white; clr.A = BYTE(m_HitMarkerFadeout*255.0f);
        if(m_isInScope)
            r3dDrawBox2D(float(cx-(rw/2)), float(cy-(rh/2)), rw, rh, r3dColor::white, m_HitMarkerTex);
        else
        {
            float yy = g_camera_mode->GetInt() == 1?cy2:cy;
            r3dDrawBox2D(float(cx-(rw/2)), float(yy-(rh/2)), rw, rh, r3dColor::white, m_HitMarkerTex);
        }
    }



if(m_HitMarkerFadeout>0)
{
        if(m_HitMarkerType == 0)
        {
            float rw = (float)m_HitMarkerTex->GetWidth();
            float rh = (float)m_HitMarkerTex->GetHeight();
            r3dColor clr = r3dColor::white; clr.A = BYTE(m_HitMarkerFadeout*255.0f);


            if(m_isInScope)
            {
                r3dDrawBox2D(float(cx-(rw/2)), float(cy-(rh/2)), rw, rh, r3dColor::white, m_HitMarkerTex);
            }
            else
            {
                float yy = g_camera_mode->GetInt() == 1?cy2:cy;
                r3dDrawBox2D(float(cx-(rw/2)), float(yy-(rh/2)), rw, rh, r3dColor::white, m_HitMarkerTex);
            }
        }
        else
        {
            float rw = (float)m_HitMarkerHeadTex->GetWidth();
            float rh = (float)m_HitMarkerHeadTex->GetHeight();
            r3dColor clr = r3dColor::white; clr.A = BYTE(m_HitMarkerFadeout*255.0f);


            if(m_isInScope)
            {
                r3dDrawBox2D(float(cx-(rw/2)), float(cy-(rh/2)), rw, rh, r3dColor::white, m_HitMarkerHeadTex);
            }
            else
            {
                float yy = g_camera_mode->GetInt() == 1?cy2:cy;
                r3dDrawBox2D(float(cx-(rw/2)), float(yy-(rh/2)), rw, rh, r3dColor::white, m_HitMarkerHeadTex);
            }
        }
    }


ท่าเต้น

https://drive.google.com/open?id=0B1mr-qG-LpkEcDNaYkJGZ1lUVVk


C:\Warz\Bin\Data\Animations5


----------------------warz_server--------------------------
หา
// server lockboxes
มองหา  PKT_C2S_LockboxPickup,
เอาทั้งหมดวางข้างใต้
PKT_C2C_StartLitter,
  PKT_C2C_StartSpank,
  PKT_C2C_StartSpanktwo,
  PKT_C2C_StartHandFlip,
  PKT_C2C_StartJack,
  PKT_C2C_StartPThrust,
  PKT_C2C_StartBigPThrust,
  PKT_C2C_StartBalls,

หา
struct PKT_C2C_PlayerJump_s : public DefaultPacketMixin<PKT_C2C_PlayerJump>
{
};

วางใต้
struct PKT_C2C_StartLitter_s : public DefaultPacketMixin<PKT_C2C_StartLitter>
{
};

struct PKT_C2C_StartSpank_s : public DefaultPacketMixin<PKT_C2C_StartSpank>
{
};

struct PKT_C2C_StartSpanktwo_s : public DefaultPacketMixin<PKT_C2C_StartSpanktwo>
{
};

struct PKT_C2C_StartHandFlip_s : public DefaultPacketMixin<PKT_C2C_StartHandFlip>
{
};

struct PKT_C2C_StartJack_s : public DefaultPacketMixin<PKT_C2C_StartJack>
{
};

struct PKT_C2C_StartPThrust_s : public DefaultPacketMixin<PKT_C2C_StartPThrust>
{
};

struct PKT_C2C_StartBigPThrust_s : public DefaultPacketMixin<PKT_C2C_StartBigPThrust>
{
};

struct PKT_C2C_StartBalls_s : public DefaultPacketMixin<PKT_C2C_StartBalls>
{
};

หา
void obj_ServerPlayer::OnNetPacket(const PKT_C2C_PlayerJump_s& n)
{
RelayPacket(&n, sizeof(n), true);
}

วางใต้
void obj_ServerPlayer::OnNetPacket(const PKT_C2C_StartLitter_s& n)
{
RelayPacket(&n, sizeof(n), true);
}

void obj_ServerPlayer::OnNetPacket(const PKT_C2C_StartSpank_s& n)
{
RelayPacket(&n, sizeof(n), true);
}

void obj_ServerPlayer::OnNetPacket(const PKT_C2C_StartSpanktwo_s& n)
{
RelayPacket(&n, sizeof(n), true);
}

void obj_ServerPlayer::OnNetPacket(const PKT_C2C_StartHandFlip_s& n)
{
RelayPacket(&n, sizeof(n), true);
}

void obj_ServerPlayer::OnNetPacket(const PKT_C2C_StartJack_s& n)
{
RelayPacket(&n, sizeof(n), true);
}

void obj_ServerPlayer::OnNetPacket(const PKT_C2C_StartPThrust_s& n)
{
RelayPacket(&n, sizeof(n), true);
}

void obj_ServerPlayer::OnNetPacket(const PKT_C2C_StartBigPThrust_s& n)
{
RelayPacket(&n, sizeof(n), true);
}

void obj_ServerPlayer::OnNetPacket(const PKT_C2C_StartBalls_s& n)
{
RelayPacket(&n, sizeof(n), true);
}

หา
DEFINE_GAMEOBJ_PACKET_HANDLER(PKT_C2C_PlayerJump);
วางใต้
DEFINE_GAMEOBJ_PACKET_HANDLER(PKT_C2C_StartLitter);
DEFINE_GAMEOBJ_PACKET_HANDLER(PKT_C2C_StartSpank);
DEFINE_GAMEOBJ_PACKET_HANDLER(PKT_C2C_StartSpanktwo);
DEFINE_GAMEOBJ_PACKET_HANDLER(PKT_C2C_StartHandFlip);
DEFINE_GAMEOBJ_PACKET_HANDLER(PKT_C2C_StartJack);
DEFINE_GAMEOBJ_PACKET_HANDLER(PKT_C2C_StartPThrust);
DEFINE_GAMEOBJ_PACKET_HANDLER(PKT_C2C_StartBigPThrust);
DEFINE_GAMEOBJ_PACKET_HANDLER(PKT_C2C_StartBalls);

หา
void OnNetPacket(const PKT_C2C_PlayerJump_s& n);

วางใต้
void OnNetPacket(const PKT_C2C_StartLitter_s& n);
void OnNetPacket(const PKT_C2C_StartSpank_s& n);
void OnNetPacket(const PKT_C2C_StartSpanktwo_s& n);
void OnNetPacket(const PKT_C2C_StartHandFlip_s& n);
void OnNetPacket(const PKT_C2C_StartJack_s& n);
void OnNetPacket(const PKT_C2C_StartPThrust_s& n);
void OnNetPacket(const PKT_C2C_StartBigPThrust_s& n);
void OnNetPacket(const PKT_C2C_StartBalls_s& n);

--------------------------------------------------------------------------------------------------
War.sln

หา
bool obj_Player::IsPushActive()
{
return pushVelocity > 0;
}
#endif

วางใต้
void obj_Player::StartLitter()
{


uberAnim_->StartLitterAnim();
PKT_C2C_StartLitter_s n;
p2pSendToHost(this, &n, sizeof(n));

}

void obj_Player::StartWeaponShow()
{


uberAnim_->StartWeaponShowAnim();

}

void obj_Player::StartSpank()
{


uberAnim_->StartSpankAnim();
PKT_C2C_StartSpank_s n;
p2pSendToHost(this, &n, sizeof(n));

}

void obj_Player::StartSpanktwo()
{


uberAnim_->StartSpanktwoAnim();
PKT_C2C_StartSpanktwo_s n;
p2pSendToHost(this, &n, sizeof(n));

}

void obj_Player::StartHandFlip()
{


uberAnim_->StartHandFlipAnim();
PKT_C2C_StartHandFlip_s n;
p2pSendToHost(this, &n, sizeof(n));

}

void obj_Player::StartJack()
{


uberAnim_->StartJackAnim();
PKT_C2C_StartJack_s n;
p2pSendToHost(this, &n, sizeof(n));

}

void obj_Player::StartPThrust()
{


uberAnim_->StartPThrustAnim();
PKT_C2C_StartPThrust_s n;
p2pSendToHost(this, &n, sizeof(n));

}

void obj_Player::StartBigPThrust()
{


uberAnim_->StartBigPThrustAnim();
PKT_C2C_StartBigPThrust_s n;
p2pSendToHost(this, &n, sizeof(n));

}

void obj_Player::StartBalls()
{


uberAnim_->StartBallsAnim();
PKT_C2C_StartBalls_s n;
p2pSendToHost(this, &n, sizeof(n));

}

หา
void obj_Player::OnNetPacket(const PKT_C2C_PlayerJump_s& n)
{
วางใต้
void obj_Player::OnNetPacket(const PKT_C2C_StartLitter_s& n)
{
uberAnim_->StartLitterAnim();
return;
}

void obj_Player::OnNetPacket(const PKT_C2C_StartSpank_s& n)
{
uberAnim_->StartSpankAnim();
return;
}

void obj_Player::OnNetPacket(const PKT_C2C_StartSpanktwo_s& n)
{
uberAnim_->StartSpanktwoAnim();
return;
}

void obj_Player::OnNetPacket(const PKT_C2C_StartHandFlip_s& n)
{
uberAnim_->StartHandFlipAnim();
return;
}

void obj_Player::OnNetPacket(const PKT_C2C_StartJack_s& n)
{
uberAnim_->StartJackAnim();
return;
}

void obj_Player::OnNetPacket(const PKT_C2C_StartPThrust_s& n)
{
uberAnim_->StartPThrustAnim();
return;
}

void obj_Player::OnNetPacket(const PKT_C2C_StartBigPThrust_s& n)
{
uberAnim_->StartBigPThrustAnim();
return;
}

void obj_Player::OnNetPacket(const PKT_C2C_StartBalls_s& n)
{
uberAnim_->StartBallsAnim();
return;
}

/*void obj_Player::OnNetPacket(const PKT_C2C_StartLitter_s& n)
{
uberAnim_->StartLitter();
return;
}*/

หา

DEFINE_GAMEOBJ_PACKET_HANDLER(PKT_C2C_PlayerJump);
วางใต้

DEFINE_GAMEOBJ_PACKET_HANDLER(PKT_C2C_StartLitter);
DEFINE_GAMEOBJ_PACKET_HANDLER(PKT_C2C_StartSpank);
   DEFINE_GAMEOBJ_PACKET_HANDLER(PKT_C2C_StartSpanktwo);
DEFINE_GAMEOBJ_PACKET_HANDLER(PKT_C2C_StartHandFlip);
DEFINE_GAMEOBJ_PACKET_HANDLER(PKT_C2C_StartJack);
DEFINE_GAMEOBJ_PACKET_HANDLER(PKT_C2C_StartPThrust);
DEFINE_GAMEOBJ_PACKET_HANDLER(PKT_C2C_StartBigPThrust);
DEFINE_GAMEOBJ_PACKET_HANDLER(PKT_C2C_StartBalls);

หา
float StartFallingTime;
วางใต้
//int TauntTrackID;
/*void TauntLitter();
void TauntSpank();
void TauntSpanktwo();
void TauntHandFlip();
void TauntJack();
void TauntPThrust();
void TauntBigPThrust();
void TauntBalls();*/
void StartLitter();
void StartWeaponShow();
void StartSpank();
void StartSpanktwo();
void StartHandFlip();
void StartJack();
void StartPThrust();
void StartBigPThrust();
void StartBalls();

หา
void OnNetPacket(const PKT_C2C_PlayerJump_s& n);
วางใต้
void OnNetPacket(const PKT_C2C_StartLitter_s& n);
void OnNetPacket(const PKT_C2C_StartSpank_s& n);
void OnNetPacket(const PKT_C2C_StartSpanktwo_s& n);
void OnNetPacket(const PKT_C2C_StartHandFlip_s& n);
void OnNetPacket(const PKT_C2C_StartJack_s& n);
void OnNetPacket(const PKT_C2C_StartPThrust_s& n);
void OnNetPacket(const PKT_C2C_StartBigPThrust_s& n);
void OnNetPacket(const PKT_C2C_StartBalls_s& n);

หา
aid_.deaths[12] = AddAnimation("Death_02_t1");//AddAnimation("Death_01_v1_s1");
}
วางใต้

void CUberData::LoadTauntAnim()
{

aid_.taunts[0] = AddAnimation("Taunt_t1_Litterbox");
aid_.taunts[1] = AddAnimation("Taunt_t1_Spank");
aid_.taunts[2] = AddAnimation("Taunt_t1_Spank_02");
aid_.taunts[3] = AddAnimation("Taunt_t1_HandFlip");
aid_.taunts[4] = AddAnimation("Taunt_t1_Jack");
aid_.taunts[5] = AddAnimation("Taunt_t1_PThrust");
aid_.taunts[6] = AddAnimation("Taunt_t1_Big_PThrust");
aid_.taunts[7] = AddAnimation("Taunt_t1_Balls");
aid_.taunts[7] = AddAnimation("Taunt_t1_Balls");
aid_.taunts[8] = AddAnimation("FPS_Weap_Show");
}
หา
anim.StartAnimation(data_->aid_.deaths[11], ANIMFLAG_PauseOnEnd | ANIMFLAG_RemoveOtherFade, 0.0f, 1.0f, 0.1f);
}


วางใต้
void CUberAnim::StartLitterAnim()
{
StopReloadAnim();
//StopGrenadeAnimations();

anim.StartAnimation(data_->aid_.taunts[0], ANIMFLAG_PauseOnEnd | ANIMFLAG_RemoveOtherFade, 0.0f, 1.0f, 0.1f);
}

void CUberAnim::StartWeaponShowAnim()
{
StopReloadAnim();
//StopGrenadeAnimations();

anim.StartAnimation(data_->aid_.taunts[8], ANIMFLAG_PauseOnEnd | ANIMFLAG_RemoveOtherFade, 0.0f, 1.0f, 0.1f);
}


void CUberAnim::StartSpankAnim()
{
StopReloadAnim();
//StopGrenadeAnimations();

anim.StartAnimation(data_->aid_.taunts[1], ANIMFLAG_PauseOnEnd | ANIMFLAG_RemoveOtherFade, 0.0f, 1.0f, 0.1f);
}

void CUberAnim::StartSpanktwoAnim()
{
StopReloadAnim();
//StopGrenadeAnimations();

anim.StartAnimation(data_->aid_.taunts[2], ANIMFLAG_PauseOnEnd | ANIMFLAG_RemoveOtherFade, 0.0f, 1.0f, 0.1f);
}

void CUberAnim::StartHandFlipAnim()
{
StopReloadAnim();
//StopGrenadeAnimations();

anim.StartAnimation(data_->aid_.taunts[3], ANIMFLAG_PauseOnEnd | ANIMFLAG_RemoveOtherFade, 0.0f, 1.0f, 0.1f);
}

void CUberAnim::StartJackAnim()
{
StopReloadAnim();
//StopGrenadeAnimations();

anim.StartAnimation(data_->aid_.taunts[4], ANIMFLAG_PauseOnEnd | ANIMFLAG_RemoveOtherFade, 0.0f, 1.0f, 0.1f);
}

void CUberAnim::StartPThrustAnim()
{
StopReloadAnim();
//StopGrenadeAnimations();

anim.StartAnimation(data_->aid_.taunts[5], ANIMFLAG_PauseOnEnd | ANIMFLAG_RemoveOtherFade, 0.0f, 1.0f, 0.1f);
}

void CUberAnim::StartBigPThrustAnim()
{
StopReloadAnim();
//StopGrenadeAnimations();

anim.StartAnimation(data_->aid_.taunts[6], ANIMFLAG_PauseOnEnd | ANIMFLAG_RemoveOtherFade, 0.0f, 1.0f, 0.1f);
}

void CUberAnim::StartBallsAnim()
{
StopReloadAnim();
//StopGrenadeAnimations();

anim.StartAnimation(data_->aid_.taunts[7], ANIMFLAG_PauseOnEnd | ANIMFLAG_RemoveOtherFade, 0.0f, 1.0f, 0.1f);
}
หา
void StartDeathAnim();
วางใต้
void StartLitterAnim();
void StartWeaponShowAnim();
void StartSpankAnim();
void StartSpanktwoAnim();
void StartHandFlipAnim();
void StartJackAnim();
void StartPThrustAnim();
void StartBigPThrustAnim();
void StartBallsAnim();
/*void StartLitter();
void StartSpank();
void StartSpanktwo();
void StartHandFlip();
void StartJack();
void StartPThrust();
void StartBigPThrust();
void StartBalls();*/
หา
pl->StartJump();
}

}

วางใต้
if(Keyboard->IsPressed(kbsNumericEnd))
{

pl->StartLitter();

}

if(Keyboard->IsPressed(kbsF) && g_camera_mode->GetInt()==2)
 {
 
  pl->StartWeaponShow();
 
 }

if(Keyboard->IsPressed(kbsNumericDown))
{

pl->StartSpank();

}

if(Keyboard->IsPressed(kbsNumericPgDn))
{

pl->StartSpanktwo();

}

if(Keyboard->IsPressed(kbsNumericLeft))
{

pl->StartHandFlip();

}

if(Keyboard->IsPressed(kbsNumericFive))
{

pl->StartJack();

}

if(Keyboard->IsPressed(kbsNumericRight))
{

pl->StartPThrust();

}

if(Keyboard->IsPressed(kbsNumericHome))
{

pl->StartBigPThrust();

}

if(Keyboard->IsPressed(kbsNumericUp))
{

pl->StartBalls();

}

หา
int deaths[20];
วางใต้
int taunts[20];
หา
void LoadDeathAnim();
วางใต้
void LoadTauntAnim();
หา
LoadDeathAnim();
วางใต้
LoadTauntAnim();

ดิส1ว

ค้นหา WarZ_Server นะคราฟ
if((GetPosition() - pos).Length() > 5.0f)
เปลี่ยนเป็น
if((GetPosition() - pos).Length() > 100.0f)
มีอยู่ทั้งหมด 3 จุด แก้ให้หมดนะครับ

เก็บของไว

ค้นหา AL_Player.cpp
// send request to pickup weapon
if(ActionUI_pressedKeyTimer > 1.0f)
{
ActionUI_pressedKeyTimer = 0.0f;
if(dropObj->isObjType(OBJTYPE_SharedUsableItem))
((SharedUsableItem*)dropObj)->m_lastPickupAttempt = curTime+1.0f; // do not attempt to pick this item for 1 sec (wait for server)
แก้ไข จาก 1.0f เป็น 0.5f
หมายเหตุ :: มี 2 ส่วนนะครับ ค้นหาแบบเดิม 2 ครั้ง
เครดิต ท่านเอ

กันแฮกตัวละคร

ไปที่ function ของ sql ที่ชื่อว่า WZ_CharChangeSkin


IF NOT EXISTS(SELECT InventoryID FROM UsersInventory WHERE CustomerID=@in_CustomerID AND ItemID=@in_HeroItemID)
BEGIN
SELECT 6 AS ResultCode, 'no hero' AS ResultMsg
UPDATE UsersData SET Accountstatus = '200' WHERE CustomerID=@in_CustomerID
RETURN
END

กันแฮกDev

วิธีดังนี้
Warz.sln
1. ไปที่ไฟล P2PMessages.h
2. ค้นหา struct PKT_C2C_MoveSetCell_s
3. เพิ่ม uint32_t isDev; ดังรูป
4. ไปที่ไฟล AI_Plater.cpp
5. ที่ฟังชั่น Update
6. ค้นหา ดังรูป นะคับ
7. เพิ่ม n1.isDev = gUserProfile.ProfileData.isDevAccount; เข้าไปตามรูปเลย
เสร็จแล้วคอมไพล์ตัวเกมคับ
เพื่อไม่ให้เกิดเออเร่อ แนะนำให้ เปิด Warz-Server.sln หลังจากแก้ตามข้างบนและคอมไพล์เสร็จ
.
มาที่ฟังเซิฟเวอร์คับ
เปิด Warz-Server.sln ขึ้นมา
8. ไปที่ไฟล obj_ServerPlayer.cpp
9. ไปที่ฟังชั่นตามรูปคับ
10. นี่คือโค้ดของเดิม เราจะแก้ ที่นี้ โดยเพิ่ม 11 และ 12 ลงไป
11. ใส่ ( ไว้
12. ใส่ ) || n.isDev != profile_.ProfileData.isDevAccount เข้าไป ตามรูป
.
คอมไพล์ตัวเซิฟ เสร็จแล้วคับ รับรองเดินไม่เกิน 3ก้าว เด้งแน่นอน
อันนี้ แค่เด้งนะคับ ไครมีความสามารถ ก็ต่อยอดให้ด้วย
เอาไปแจกต่อได้ไม่ว่า เครดิท ไม่ต้องให้ผม
ขอแค่ ไม่ขาย เป็นพอ
by.IceyBoy Kung

กันปั้ม api ที่ปั้มผ่าน charles

เอาไปทับใส่ function sql ที่ชื่อว่า WZ_BackpackFromInv


ALTER PROCEDURE [dbo].[WZ_BackpackFromInv]
    @in_CustomerID int,
    @in_CharID int,
    @in_InventoryID bigint,
    @in_Slot int,
    @in_Amount int,
    @in_ServerCall int = 0
AS
BEGIN
    SET NOCOUNT ON;
 
    if(@in_Amount <= 0) begin
        select 6 as ResultCode, 'bad amount' as ResultMsg
        exec DBG_StoreApiCall 'FromInv#1', 1, @in_CustomerID, @in_CharID, @in_Slot, -1, @in_Amount
        return
    end

    -- check if CustomerID/CharID pair is valid
    declare @CustomerID int
    declare @BackpackSize int
    declare @GameFlags int
    select @CustomerID=CustomerID, @BackpackSize=BackpackSize, @GameFlags=GameFlags FROM UsersChars WHERE CharID=@in_CharID
    if(@@ROWCOUNT = 0 or @CustomerID <> @in_CustomerID) begin
        select 6 as ResultCode, 'bad charid' as ResultMsg
        return
    end
 
    -- must be in safe zone
    if(@in_ServerCall = 0 and (@GameFlags & 1) = 0) begin
        select 6 as ResultCode, 'not in safezone' as ResultMsg
        return
    end
 
    -- check if game is still active or 90sec passed from last update (COPYPASTE_GAMECHECK, search for others)
    declare @lastgamedate datetime
    declare @GameServerId int
    select @GameServerId=GameServerId, @lastgamedate=lastgamedate from UsersData where CustomerID=@in_CustomerID
    if(@in_ServerCall = 0 and @GameServerId > 0 and DATEDIFF(second, @lastgamedate, GETDATE()) < 360) begin
        select 7 as ResultCode, 'game still active' as ResultMsg
        exec DBG_StoreApiCall 'FromInv#InGame', 2, @in_CustomerID, @in_CharID, @in_Slot, -1, @in_Amount, @GameServerId
        return
    end
 
    -- check if we have that item in inventory
    declare @InvCustomerID int
    declare @InvInventoryID bigint
    declare @InvItemID int
    declare @InvLeasedUntil datetime
    declare @InvQuantity int
    declare @InvVar1 int
    declare @InvVar2 int
    declare @InvVar3 int
    select
        @InvCustomerID=CustomerID,
        @InvInventoryID=InventoryID,
        @InvItemID=ItemID,
        @InvQuantity=Quantity,
        @InvLeasedUntil=LeasedUntil,
        @InvVar1=Var1,
        @InvVar2=Var2,
        @InvVar3=Var3
    from UsersInventory where InventoryID=@in_InventoryID
    if(@@ROWCOUNT = 0 or @InvCustomerID <> @in_CustomerID) begin
        select 6 as ResultCode, 'bad inventoryid' as ResultMsg
        return
    end
 
    if(@in_Amount > @InvQuantity) begin
        select 6 as ResultCode, 'bad quantity' as ResultMsg
        return
    end
 
    -- validate backpack slot number
    if(@in_Slot < 0 or @in_Slot >= @BackpackSize) begin
        select 6 as ResultCode, 'bad slot' as ResultMsg
        return
    end
    -- validate if we can move to that slot
    declare @BackpackInventoryID bigint = 0
    declare @BackpackItemID int = 0
    declare @BackpackVar1 int = 0
    declare @BackpackVar2 int = 0
    declare @BackpackVar3 int = 0
    select
        @BackpackInventoryID=InventoryID,
        @BackpackItemID=ItemID,
        @BackpackVar1=Var1,
        @BackpackVar2=Var2,
        @BackpackVar3=Var3
    from UsersInventory where CharID=@in_CharID and BackpackSlot=@in_Slot
    if(@@ROWCOUNT > 0) begin
        if(@BackpackItemID <> @InvItemID) begin
            select 6 as ResultCode, 'bad inventory id 2' as ResultMsg
            return
        end
        if(@BackpackVar1 <> @InvVar1 or @BackpackVar2 <> @InvVar2 or @BackpackVar3 <> @InvVar3) begin
            exec DBG_StoreApiCall 'FromInv_BadStack', 3, @in_CustomerID, @in_CharID, @in_Slot, @InvItemID, @in_Amount, @InvInventoryID, @BackpackInventoryID
            select 6 as ResultCode, 'bad stacking' as ResultMsg
            return
        end
        declare @CanStackWith int = 0
        exec @CanStackWith = FN_IsItemStackable @BackpackItemID, 0
        if(@CanStackWith = 0) begin
            exec DBG_StoreApiCall 'FromInv_NoStack', 3, @in_CustomerID, @in_CharID, @in_Slot, @InvItemID, @in_Amount, @InvInventoryID, @BackpackInventoryID
            select 6 as ResultCode, 'not stackable' as ResultMsg
            return
        end
    end

    -- clear attachments if moved item was in weapon slot
    if(@in_Slot = 0) update UsersChars set Attachment1='' where CharID=@in_CharID
    if(@in_Slot = 1) update UsersChars set Attachment2='' where CharID=@in_CharID
    -- check for easy case, unmodified item, no such item in backpack
    if(@BackpackInventoryID = 0 and @InvQuantity = @in_Amount)
    begin
        update UsersInventory set BackpackSlot=@in_Slot, CharID=@in_CharID where InventoryID=@InvInventoryID      
        select 0 as ResultCode
        select @InvInventoryID as 'InventoryID'

        if(@in_ServerCall > 0)  exec DBG_StoreApiCall 'FromInv_Srv', 0, @in_CustomerID, @in_CharID, @in_Slot, @InvItemID, @in_Amount, @InvInventoryID, @BackpackInventoryID
        else                    exec DBG_StoreApiCall 'FromInv', 0, @in_CustomerID, @in_CharID, @in_Slot, @InvItemID, @in_Amount, @InvInventoryID, @BackpackInventoryID
        return
    end

    if exists(SELECT * FROM UsersInventory where InventoryID=@InvInventoryID AND Quantity = @in_Amount) and ((SELECT Quantity FROM UsersInventory where InventoryID=@InvInventoryID) = @in_Amount)
    begin
        delete from UsersInventory where InventoryID=@InvInventoryID      
        if(@@ROWCOUNT = 0) begin
            select 6 as ResultCode, 'bad inventoryid' as ResultMsg
            return
        end
        ELSE
        BEGIN
            if not exists(select InventoryID from UsersInventory where InventoryID=@BackpackInventoryID)
            begin
                -- modified (won't stack) or new backpack item
                INSERT INTO UsersInventory (
                    CustomerID,
                    CharID,
                    ItemID,
                    BackpackSlot,
                    LeasedUntil,
                    Quantity,
                    Var1,
                    Var2,
                    Var3
                )
                VALUES (
                    @in_CustomerID,
                    @in_CharID,
                    @InvItemID,
                    @in_Slot,
                    @InvLeasedUntil,
                    @in_Amount,
                    @InvVar1,
                    @InvVar2,
                    @InvVar3
                )
                set @BackpackInventoryID = SCOPE_IDENTITY()
            end
            else
            begin
                update UsersInventory set Quantity=(Quantity+@in_Amount) where InventoryID=@BackpackInventoryID
            end
             
            select 0 as ResultCode;
            select @BackpackInventoryID as 'InventoryID'

            if(@in_ServerCall > 0) exec DBG_StoreApiCall 'FromInv_Srv', 0, @in_CustomerID, @in_CharID, @in_Slot, @InvItemID, @in_Amount, @InvInventoryID, @BackpackInventoryID
            else                   exec DBG_StoreApiCall 'FromInv',     0, @in_CustomerID, @in_CharID, @in_Slot, @InvItemID, @in_Amount, @InvInventoryID, @BackpackInventoryID
            return
        end
    end

    if exists(SELECT * FROM UsersInventory where InventoryID=@InvInventoryID AND Quantity > @in_Amount) and ((SELECT Quantity FROM UsersInventory where InventoryID=@InvInventoryID) > @in_Amount)
    begin
 
        update UsersInventory set Quantity=(Quantity-@in_Amount) where InventoryID=@InvInventoryID
        if(@@ROWCOUNT = 0) begin
            select 6 as ResultCode, 'bad inventoryid' as ResultMsg
            return
        end
        ELSE
        BEGIN
            if not exists(select InventoryID from UsersInventory where InventoryID=@BackpackInventoryID)
            begin
                -- modified (won't stack) or new backpack item
                INSERT INTO UsersInventory (
                    CustomerID,
                    CharID,
                    ItemID,
                    BackpackSlot,
                    LeasedUntil,
                    Quantity,
                    Var1,
                    Var2,
                    Var3
                )
                VALUES (
                    @in_CustomerID,
                    @in_CharID,
                    @InvItemID,
                    @in_Slot,
                    @InvLeasedUntil,
                    @in_Amount,
                    @InvVar1,
                    @InvVar2,
                    @InvVar3
                )
                set @BackpackInventoryID = SCOPE_IDENTITY()
            end
            else
            begin
                update UsersInventory set Quantity=(Quantity+@in_Amount) where InventoryID=@BackpackInventoryID
            end  
         
            select 0 as ResultCode;
            select @BackpackInventoryID as 'InventoryID'

            if(@in_ServerCall > 0) exec DBG_StoreApiCall 'FromInv_Srv', 0, @in_CustomerID, @in_CharID, @in_Slot, @InvItemID, @in_Amount, @InvInventoryID, @BackpackInventoryID
            else                   exec DBG_StoreApiCall 'FromInv',     0, @in_CustomerID, @in_CharID, @in_Slot, @InvItemID, @in_Amount, @InvInventoryID, @BackpackInventoryID
            return    
        end
    end
END




เอาไปทับใส่ function sql ที่ชื่อว่า WZ_BackpackToInv



ALTER PROCEDURE [dbo].[WZ_BackpackToInv]
    @in_CustomerID int,
    @in_CharID int,
    @in_InventoryID bigint, -- target inventory id where to put that item
    @in_Slot int,
    @in_Amount int,
    @in_ServerCall int = 0
AS
BEGIN
    SET NOCOUNT ON;

    if(@in_Amount <= 0) begin
        select 6 as ResultCode, 'bad amount' as ResultMsg
        exec DBG_StoreApiCall 'ToInv#1', 1, @in_CustomerID, @in_CharID, @in_Slot, -1, @in_Amount
        return
    end

    -- check if CustomerID/CharID pair is valid
    declare @CustomerID int
    declare @GameFlags int
    select @CustomerID=CustomerID, @GameFlags=GameFlags FROM UsersChars WHERE CharID=@in_CharID
    if(@@ROWCOUNT = 0 or @CustomerID <> @in_CustomerID) begin
        select 6 as ResultCode, 'bad charid' as ResultMsg
        return
    end

    -- must be in safe zone
    if(@in_ServerCall = 0 and (@GameFlags & 1) = 0) begin
        select 6 as ResultCode, 'not in safezone' as ResultMsg
        return
    end
 
    -- check if game is still active or 90sec passed from last update (COPYPASTE_GAMECHECK, search for others)
    declare @lastgamedate datetime
    declare @GameServerId int
    select @GameServerId=GameServerId, @lastgamedate=lastgamedate from UsersData where CustomerID=@in_CustomerID
    if(@in_ServerCall = 0 and @GameServerId > 0 and DATEDIFF(second, @lastgamedate, GETDATE()) < 360) begin
        select 7 as ResultCode, 'game still active' as ResultMsg
        exec DBG_StoreApiCall 'ToInv#InGame', 2, @in_CustomerID, @in_CharID, @in_Slot, -1, @in_Amount, @GameServerId
        return
    end
 
    declare @BackpackInventoryID bigint
    declare @BackpackItemID int
    declare @BackpackLeasedUntil datetime
    declare @BackpackQuantity int
    declare @BackpackVar1 int
    declare @BackpackVar2 int
    declare @BackpackVar3 int
    select
        @BackpackInventoryID=InventoryID,
        @BackpackItemID=ItemID,
        @BackpackQuantity=Quantity,
        @BackpackLeasedUntil=LeasedUntil,
        @BackpackVar1=Var1,
        @BackpackVar2=Var2,
        @BackpackVar3=Var3
    from UsersInventory where CharID=@in_CharID and BackpackSlot=@in_Slot
    if(@@ROWCOUNT = 0) begin
        select 6 as ResultCode, 'bad slot' as ResultMsg
        return
    end
 
    if(@in_Amount > @BackpackQuantity) begin
        select 6 as ResultCode, 'bad quantity' as ResultMsg
        return
    end
 
    -- check for easy case, just switching to inventory

    if(@in_InventoryID = 0 and @BackpackQuantity = @in_Amount)
    begin
        update UsersInventory set BackpackSlot=-1, CharID=0 where InventoryID=@BackpackInventoryID

        select 0 as ResultCode
        select @BackpackInventoryID as 'InventoryID'

        if(@in_ServerCall > 0) exec DBG_StoreApiCall 'ToInv_Srv', 0, @in_CustomerID, @in_CharID, @in_Slot, @BackpackItemID, @in_Amount, @BackpackInventoryID
        else                   exec DBG_StoreApiCall 'ToInv', 0, @in_CustomerID, @in_CharID, @in_Slot, @BackpackItemID, @in_Amount, @BackpackInventoryID
        return
    end
    -- validate that we own that inventory slot and item can be moved there
    if(@in_InventoryID > 0)
    begin
        declare @InvCustomerID int
        declare @InvCharID int
        declare @InvItemID int
        declare @InvVar1 int
        declare @InvVar2 int
        declare @InvVar3 int
        select
            @InvCustomerID=CustomerID,
            @InvCharID=CharID,
            @InvItemID=ItemID,
            @InvVar1=Var1,
            @InvVar2=Var2,
            @InvVar3=Var3
            from UsersInventory where InventoryID=@in_InventoryID
        if(@@ROWCOUNT = 0 or @InvCustomerID <> @in_CustomerID or @InvCharID <> 0 or @InvItemID <> @BackpackItemID) begin
            select 6 as ResultCode, 'bad inventoryid' as ResultMsg
            return
        end
        if(@InvVar1 <> @BackpackVar1 or @InvVar2 <> @BackpackVar2 or @InvVar3 <> @BackpackVar3) begin
            exec DBG_StoreApiCall 'ToInv_BadStack', 3, @in_CustomerID, @in_CharID, @in_Slot, @BackpackItemID, @in_Amount, @BackpackInventoryID, 0
            select 6 as ResultCode, 'bad stacking' as ResultMsg
            return
        end
        declare @CanStackWith int = 0
        exec @CanStackWith = FN_IsItemStackable @InvItemID, 1
        if(@CanStackWith = 0) begin
            exec DBG_StoreApiCall 'ToInv_NoStack', 3, @in_CustomerID, @in_CharID, @in_Slot, @BackpackItemID, @in_Amount, @BackpackInventoryID, 0
            select 6 as ResultCode, 'not stackable' as ResultMsg
            return
        end
    end

    declare @InvInventoryID bigint = @in_InventoryID
    if exists(SELECT * FROM UsersInventory where InventoryID=@BackpackInventoryID AND Quantity = @in_Amount) and ((SELECT Quantity FROM UsersInventory where InventoryID=@BackpackInventoryID) = @in_Amount)
    BEGIN    
        delete from UsersInventory where InventoryID=@BackpackInventoryID
        if(@@ROWCOUNT = 0) begin
            select 6 as ResultCode, 'bad inventoryid' as ResultMsg
            return
        end
        ELSE
        BEGIN
            if not exists(select InventoryID from UsersInventory where InventoryID=@InvInventoryID) begin
            -- modified (won't stack) or new inventory item
                INSERT INTO UsersInventory (
                    CustomerID,
                    CharID,
                    BackpackSlot,
                    ItemID,
                    LeasedUntil,
                    Quantity,
                    Var1,
                    Var2,
                    Var3
                )
                VALUES (
                    @in_CustomerID,
                    0,
                    -1,
                    @BackpackItemID,
                    @BackpackLeasedUntil,
                    @in_Amount,
                    @BackpackVar1,
                    @BackpackVar2,
                    @BackpackVar3
                )
                set @InvInventoryID = SCOPE_IDENTITY()
            end
            else begin
                update UsersInventory set Quantity=(Quantity+@in_Amount) where InventoryID=@InvInventoryID
            end
            select 0 as ResultCode
            select @InvInventoryID as 'InventoryID'

            if(@in_ServerCall > 0) exec DBG_StoreApiCall 'ToInv_Srv', 0, @in_CustomerID, @in_CharID, @in_Slot, @BackpackItemID, @in_Amount, @BackpackInventoryID, @InvInventoryID
            else                   exec DBG_StoreApiCall 'ToInv',     0, @in_CustomerID, @in_CharID, @in_Slot, @BackpackItemID, @in_Amount, @BackpackInventoryID, @InvInventoryID
            return
        end
    END

    if exists(SELECT * FROM UsersInventory where InventoryID=@BackpackInventoryID AND Quantity > @in_Amount) and ((SELECT Quantity FROM UsersInventory where InventoryID=@BackpackInventoryID) > @in_Amount)
    BEGIN
        update UsersInventory set Quantity=(Quantity-@in_Amount) where InventoryID=@BackpackInventoryID
        if(@@ROWCOUNT = 0) begin
            select 6 as ResultCode, 'bad inventoryid' as ResultMsg
            return
        end
        ELSE
        BEGIN
            if not exists(select InventoryID from UsersInventory where InventoryID=@InvInventoryID) begin
            -- modified (won't stack) or new inventory item
                INSERT INTO UsersInventory (
                    CustomerID,
                    CharID,
                    ItemID,
                    LeasedUntil,
                    Quantity,
                    Var1,
                    Var2,
                    Var3
                )
                VALUES (
                    @in_CustomerID,
                    0,
                    @BackpackItemID,
                    @BackpackLeasedUntil,
                    @in_Amount,
                    @BackpackVar1,
                    @BackpackVar2,
                    @BackpackVar3
                )
                set @InvInventoryID = SCOPE_IDENTITY()
            end
            else begin
                update UsersInventory set Quantity=(Quantity+@in_Amount) where InventoryID=@InvInventoryID
            end
            select 0 as ResultCode
            select @InvInventoryID as 'InventoryID'

            if(@in_ServerCall > 0) exec DBG_StoreApiCall 'ToInv_Srv', 0, @in_CustomerID, @in_CharID, @in_Slot, @BackpackItemID, @in_Amount, @BackpackInventoryID, @InvInventoryID
            else                   exec DBG_StoreApiCall 'ToInv',     0, @in_CustomerID, @in_CharID, @in_Slot, @BackpackItemID, @in_Amount, @BackpackInventoryID, @InvInventoryID
            return
            END
        END
END