mirror of
https://github.com/YGGverse/hlsdk-portable.git
synced 2025-01-12 07:58:05 +00:00
Merge branch 'master' into residual_point
This commit is contained in:
commit
1e6bef06c5
3
.gitignore
vendored
3
.gitignore
vendored
@ -17,3 +17,6 @@ cmake_install.cmake
|
||||
*.vsxproj
|
||||
*.vsproj
|
||||
*.sln
|
||||
.waf-*
|
||||
.lock*
|
||||
*.pyc
|
||||
|
@ -32,7 +32,6 @@ project (HLSDK-XASH3D)
|
||||
#--------------
|
||||
# USER DEFINES \
|
||||
################\
|
||||
option(64BIT "Allow 64 Bit builds" OFF)
|
||||
option(USE_VGUI "Enable VGUI1. UNDONE" OFF)
|
||||
option(USE_VGUI2 "Enable VGUI2. UNDONE" OFF)
|
||||
option(USE_VOICEMGR "Enable VOICE MANAGER." OFF)
|
||||
@ -55,8 +54,8 @@ if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT 64BIT)
|
||||
if(MSVC)
|
||||
error("UNDONE: set 32 build flags")
|
||||
else()
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_FLAGS}")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32")
|
||||
endif()
|
||||
set(CMAKE_SIZEOF_VOID_P 4)
|
||||
|
39
LICENSE
Normal file
39
LICENSE
Normal file
@ -0,0 +1,39 @@
|
||||
Half Life 1 SDK LICENSE
|
||||
======================
|
||||
|
||||
Half Life 1 SDK Copyright(c) Valve Corp.
|
||||
|
||||
THIS DOCUMENT DESCRIBES A CONTRACT BETWEEN YOU AND VALVE CORPORATION ("Valve").
|
||||
PLEASE READ IT BEFORE DOWNLOADING OR USING THE HALF LIFE 1 SDK ("SDK"). BY
|
||||
DOWNLOADING AND/OR USING THE HALF LIFE 1 SDK YOU ACCEPT THIS LICENSE. IF YOU DO
|
||||
NOT AGREE TO THE TERMS OF THIS LICENSE PLEASE DON'T DOWNLOAD OR USE THE SDK.
|
||||
|
||||
You may, free of charge, download and use the SDK to develop a modified Valve
|
||||
game running on the Half-Life 1 engine. You may distribute your modified Valve
|
||||
game in source and object code form, but only for free. Terms of use for Valve
|
||||
games are found in the Steam Subscriber Agreement located here:
|
||||
http://store.steampowered.com/subscriber_agreement/
|
||||
|
||||
You may copy, modify, and distribute the SDK and any modifications you make to
|
||||
the SDK in source and object code form, but only for free. Any distribution of
|
||||
this SDK must include this LICENSE file.
|
||||
|
||||
Any distribution of the SDK or a substantial portion of the SDK must include
|
||||
the above copyright notice and the following:
|
||||
|
||||
DISCLAIMER OF WARRANTIES. THE HALF LIFE 1 SDK AND ANY OTHER MATERIAL
|
||||
DOWNLOADED BY LICENSEE IS PROVIDED "AS IS". VALVE AND ITS SUPPLIERS
|
||||
DISCLAIM ALL WARRANTIES WITH RESPECT TO THE SDK, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY,
|
||||
NON-INFRINGEMENT, TITLE AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
LIMITATION OF LIABILITY. IN NO EVENT SHALL VALVE OR ITS SUPPLIERS BE LIABLE
|
||||
FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER
|
||||
(INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS,
|
||||
BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY
|
||||
LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE THE ENGINE AND/OR THE
|
||||
SDK, EVEN IF VALVE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
|
||||
If you would like to use the SDK for a commercial purpose, please contact Valve
|
||||
at sourceengine@valvesoftware.com.
|
@ -30,6 +30,7 @@ add_definitions(-DCLIENT_WEAPONS -DCLIENT_DLL -DCROWBAR_IDLE_ANIM)
|
||||
if(NOT MSVC)
|
||||
add_compile_options(-fno-exceptions) # GCC/Clang flag
|
||||
add_compile_options(-Wno-write-strings) # GCC/Clang flag
|
||||
add_compile_options(-fvisibility=hidden) # GCC/Clang flag
|
||||
add_definitions(-D_LINUX -DLINUX) # It seems enough for all non-Win32 systems
|
||||
add_definitions(-Dstricmp=strcasecmp -Dstrnicmp=strncasecmp)
|
||||
if(NOT MINGW)
|
||||
|
@ -56,7 +56,7 @@ void CHudMOTD::Reset( void )
|
||||
m_bShow = 0;
|
||||
}
|
||||
|
||||
#define LINE_HEIGHT 13
|
||||
#define LINE_HEIGHT (gHUD.m_scrinfo.iCharHeight)
|
||||
#define ROW_GAP 13
|
||||
#define ROW_RANGE_MIN 30
|
||||
#define ROW_RANGE_MAX ( ScreenHeight - 100 )
|
||||
|
@ -212,7 +212,9 @@ void TeamFortressViewport::paintBackground()
|
||||
// int wide, tall;
|
||||
// getParent()->getSize( wide, tall );
|
||||
// setSize( wide, tall );
|
||||
gEngfuncs.VGui_ViewportPaintBackground(HUD_GetRect());
|
||||
int extents[4];
|
||||
getParent()->getAbsExtents(extents[0],extents[1],extents[2],extents[3]);
|
||||
gEngfuncs.VGui_ViewportPaintBackground(extents);
|
||||
}
|
||||
|
||||
void *TeamFortressViewport::operator new( size_t stAllocateBlock )
|
||||
|
@ -38,7 +38,7 @@ typedef int ( *pfnUserMsgHook )( const char *pszName, int iSize, void *pbuf );
|
||||
#include "../engine/cdll_int.h"
|
||||
#include "../dlls/cdll_dll.h"
|
||||
|
||||
#ifndef __MSC_VER
|
||||
#if !defined(_WIN32)
|
||||
#define _cdecl
|
||||
#endif
|
||||
#include "exportdef.h"
|
||||
|
@ -116,7 +116,7 @@ void HUD_PlaySound( const char *sound, float volume )
|
||||
if( !g_runfuncs || !g_finalstate )
|
||||
return;
|
||||
|
||||
gEngfuncs.pfnPlaySoundByNameAtLocation( sound, volume, (float *)&g_finalstate->playerstate.origin );
|
||||
gEngfuncs.pfnPlaySoundByNameAtLocation( sound, volume, g_finalstate->playerstate.origin );
|
||||
}
|
||||
|
||||
/*
|
||||
@ -127,7 +127,7 @@ Directly queue up an event on the client
|
||||
=====================
|
||||
*/
|
||||
void HUD_PlaybackEvent( int flags, const edict_t *pInvoker, unsigned short eventindex, float delay,
|
||||
float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 )
|
||||
const float *origin, const float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 )
|
||||
{
|
||||
vec3_t org;
|
||||
vec3_t ang;
|
||||
@ -138,7 +138,7 @@ void HUD_PlaybackEvent( int flags, const edict_t *pInvoker, unsigned short event
|
||||
// Weapon prediction events are assumed to occur at the player's origin
|
||||
org = g_finalstate->playerstate.origin;
|
||||
ang = v_angles;
|
||||
gEngfuncs.pfnPlaybackEvent( flags, pInvoker, eventindex, delay, (float *)&org, (float *)&ang, fparam1, fparam2, iparam1, iparam2, bparam1, bparam2 );
|
||||
gEngfuncs.pfnPlaybackEvent( flags, pInvoker, eventindex, delay, org, ang, fparam1, fparam2, iparam1, iparam2, bparam1, bparam2 );
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -27,7 +27,7 @@ int UTIL_SharedRandomLong( unsigned int seed, int low, int high );
|
||||
int HUD_GetWeaponAnim( void );
|
||||
void HUD_SendWeaponAnim( int iAnim, int body, int force );
|
||||
void HUD_PlaySound( const char *sound, float volume );
|
||||
void HUD_PlaybackEvent( int flags, const struct edict_s *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 );
|
||||
void HUD_PlaybackEvent( int flags, const struct edict_s *pInvoker, unsigned short eventindex, float delay, const float *origin, const float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 );
|
||||
void HUD_SetMaxSpeed( const struct edict_s *ed, float speed );
|
||||
int stub_PrecacheModel( const char* s );
|
||||
int stub_PrecacheSound( const char* s );
|
||||
|
@ -8,68 +8,68 @@ echo -- Compiler is MSVC6
|
||||
|
||||
set XASH3DSRC=..\..\Xash3D_original
|
||||
set INCLUDES=-I../common -I../engine -I../pm_shared -I../game_shared -I../public -I../external -I../dlls -I../utils/false_vgui/include
|
||||
set SOURCES=../dlls/crossbow.cpp^
|
||||
../dlls/crowbar.cpp^
|
||||
../dlls/egon.cpp^
|
||||
../dlls/gauss.cpp^
|
||||
../dlls/handgrenade.cpp^
|
||||
../dlls/hornetgun.cpp^
|
||||
../dlls/mp5.cpp^
|
||||
../dlls/python.cpp^
|
||||
../dlls/rpg.cpp^
|
||||
../dlls/satchel.cpp^
|
||||
../dlls/shotgun.cpp^
|
||||
../dlls/squeakgrenade.cpp^
|
||||
../dlls/tripmine.cpp^
|
||||
../dlls/glock.cpp^
|
||||
ev_hldm.cpp^
|
||||
hl/hl_baseentity.cpp^
|
||||
hl/hl_events.cpp^
|
||||
hl/hl_objects.cpp^
|
||||
hl/hl_weapons.cpp^
|
||||
ammo.cpp^
|
||||
ammo_secondary.cpp^
|
||||
ammohistory.cpp^
|
||||
battery.cpp^
|
||||
cdll_int.cpp^
|
||||
com_weapons.cpp^
|
||||
death.cpp^
|
||||
demo.cpp^
|
||||
entity.cpp^
|
||||
ev_common.cpp^
|
||||
events.cpp^
|
||||
flashlight.cpp^
|
||||
GameStudioModelRenderer.cpp^
|
||||
geiger.cpp^
|
||||
health.cpp^
|
||||
hud.cpp^
|
||||
hud_msg.cpp^
|
||||
hud_redraw.cpp^
|
||||
hud_spectator.cpp^
|
||||
hud_update.cpp^
|
||||
in_camera.cpp^
|
||||
input.cpp^
|
||||
input_goldsource.cpp^
|
||||
input_mouse.cpp^
|
||||
input_xash3d.cpp^
|
||||
menu.cpp^
|
||||
message.cpp^
|
||||
overview.cpp^
|
||||
parsemsg.cpp^
|
||||
../pm_shared/pm_debug.c^
|
||||
../pm_shared/pm_math.c^
|
||||
../pm_shared/pm_shared.c^
|
||||
saytext.cpp^
|
||||
status_icons.cpp^
|
||||
statusbar.cpp^
|
||||
studio_util.cpp^
|
||||
StudioModelRenderer.cpp^
|
||||
text_message.cpp^
|
||||
train.cpp^
|
||||
tri.cpp^
|
||||
util.cpp^
|
||||
view.cpp^
|
||||
scoreboard.cpp^
|
||||
set SOURCES=../dlls/crossbow.cpp ^
|
||||
../dlls/crowbar.cpp ^
|
||||
../dlls/egon.cpp ^
|
||||
../dlls/gauss.cpp ^
|
||||
../dlls/handgrenade.cpp ^
|
||||
../dlls/hornetgun.cpp ^
|
||||
../dlls/mp5.cpp ^
|
||||
../dlls/python.cpp ^
|
||||
../dlls/rpg.cpp ^
|
||||
../dlls/satchel.cpp ^
|
||||
../dlls/shotgun.cpp ^
|
||||
../dlls/squeakgrenade.cpp ^
|
||||
../dlls/tripmine.cpp ^
|
||||
../dlls/glock.cpp ^
|
||||
ev_hldm.cpp ^
|
||||
hl/hl_baseentity.cpp ^
|
||||
hl/hl_events.cpp ^
|
||||
hl/hl_objects.cpp ^
|
||||
hl/hl_weapons.cpp ^
|
||||
ammo.cpp ^
|
||||
ammo_secondary.cpp ^
|
||||
ammohistory.cpp ^
|
||||
battery.cpp ^
|
||||
cdll_int.cpp ^
|
||||
com_weapons.cpp ^
|
||||
death.cpp ^
|
||||
demo.cpp ^
|
||||
entity.cpp ^
|
||||
ev_common.cpp ^
|
||||
events.cpp ^
|
||||
flashlight.cpp ^
|
||||
GameStudioModelRenderer.cpp ^
|
||||
geiger.cpp ^
|
||||
health.cpp ^
|
||||
hud.cpp ^
|
||||
hud_msg.cpp ^
|
||||
hud_redraw.cpp ^
|
||||
hud_spectator.cpp ^
|
||||
hud_update.cpp ^
|
||||
in_camera.cpp ^
|
||||
input.cpp ^
|
||||
input_goldsource.cpp ^
|
||||
input_mouse.cpp ^
|
||||
input_xash3d.cpp ^
|
||||
menu.cpp ^
|
||||
message.cpp ^
|
||||
overview.cpp ^
|
||||
parsemsg.cpp ^
|
||||
../pm_shared/pm_debug.c ^
|
||||
../pm_shared/pm_math.c ^
|
||||
../pm_shared/pm_shared.c ^
|
||||
saytext.cpp ^
|
||||
status_icons.cpp ^
|
||||
statusbar.cpp ^
|
||||
studio_util.cpp ^
|
||||
StudioModelRenderer.cpp ^
|
||||
text_message.cpp ^
|
||||
train.cpp ^
|
||||
tri.cpp ^
|
||||
util.cpp ^
|
||||
view.cpp ^
|
||||
scoreboard.cpp ^
|
||||
MOTD.cpp
|
||||
set DEFINES=/DCLIENT_DLL /DCLIENT_WEAPONS /Dsnprintf=_snprintf /DNO_VOICEGAMEMGR /DGOLDSOURCE_SUPPORT
|
||||
set LIBS=user32.lib Winmm.lib
|
||||
|
@ -1410,7 +1410,9 @@ enum EGON_FIREMODE
|
||||
#define EGON_SOUND_RUN "weapons/egon_run3.wav"
|
||||
#define EGON_SOUND_STARTUP "weapons/egon_windup2.wav"
|
||||
|
||||
#if !defined(ARRAYSIZE)
|
||||
#define ARRAYSIZE(p) ( sizeof(p) /sizeof(p[0]) )
|
||||
#endif
|
||||
|
||||
BEAM *pBeam;
|
||||
BEAM *pBeam2;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -240,7 +240,7 @@ void CHudMessage::MessageDrawScan( client_textmessage_t *pMessage, float time )
|
||||
{
|
||||
int i, j, length, width;
|
||||
const char *pText;
|
||||
unsigned char line[80];
|
||||
const char *pLineStart;
|
||||
|
||||
pText = pMessage->pMessage;
|
||||
// Count lines
|
||||
@ -278,22 +278,21 @@ void CHudMessage::MessageDrawScan( client_textmessage_t *pMessage, float time )
|
||||
{
|
||||
m_parms.lineLength = 0;
|
||||
m_parms.width = 0;
|
||||
pLineStart = pText;
|
||||
while( *pText && *pText != '\n' )
|
||||
{
|
||||
unsigned char c = *pText;
|
||||
line[m_parms.lineLength] = c;
|
||||
m_parms.width += gHUD.m_scrinfo.charWidths[c];
|
||||
m_parms.lineLength++;
|
||||
pText++;
|
||||
}
|
||||
pText++; // Skip LF
|
||||
line[m_parms.lineLength] = 0;
|
||||
|
||||
m_parms.x = XPosition( pMessage->x, m_parms.width, m_parms.totalWidth );
|
||||
|
||||
for( j = 0; j < m_parms.lineLength; j++ )
|
||||
{
|
||||
m_parms.text = line[j];
|
||||
m_parms.text = pLineStart[j];
|
||||
int next = m_parms.x + gHUD.m_scrinfo.charWidths[m_parms.text];
|
||||
MessageScanNextChar();
|
||||
|
||||
|
@ -108,7 +108,7 @@ We have a minimum width of 1-320 - we could have the field widths scale with it?
|
||||
int SCOREBOARD_WIDTH = 320;
|
||||
|
||||
// Y positions
|
||||
#define ROW_GAP 13
|
||||
#define ROW_GAP (gHUD.m_scrinfo.iCharHeight)
|
||||
#define ROW_RANGE_MIN 15
|
||||
#define ROW_RANGE_MAX ( ScreenHeight - 50 )
|
||||
|
||||
|
66
cl_dll/wscript
Normal file
66
cl_dll/wscript
Normal file
@ -0,0 +1,66 @@
|
||||
#! /usr/bin/env python
|
||||
# encoding: utf-8
|
||||
# a1batross, mittorn, 2018
|
||||
|
||||
from waflib import Utils
|
||||
import os
|
||||
|
||||
def options(opt):
|
||||
# stub
|
||||
return
|
||||
|
||||
def configure(conf):
|
||||
if conf.env.GOLDSRC:
|
||||
if conf.env.DEST_OS != 'win32':
|
||||
conf.check_cc(lib='dl')
|
||||
|
||||
def build(bld):
|
||||
source = bld.path.parent.ant_glob([
|
||||
'pm_shared/*.c',
|
||||
'dlls/crossbow.cpp', 'dlls/crowbar.cpp', 'dlls/egon.cpp', 'dlls/gauss.cpp', 'dlls/handgrenade.cpp',
|
||||
'dlls/hornetgun.cpp', 'dlls/mp5.cpp', 'dlls/python.cpp', 'dlls/rpg.cpp', 'dlls/satchel.cpp',
|
||||
'dlls/shotgun.cpp', 'dlls/squeakgrenade.cpp', 'dlls/tripmine.cpp', 'dlls/glock.cpp'
|
||||
])
|
||||
|
||||
source += bld.path.ant_glob(['hl/*.cpp'])
|
||||
source += [
|
||||
'ev_hldm.cpp', 'ammo.cpp', 'ammo_secondary.cpp', 'ammohistory.cpp',
|
||||
'battery.cpp', 'cdll_int.cpp', 'com_weapons.cpp', 'death.cpp',
|
||||
'demo.cpp', 'entity.cpp', 'ev_common.cpp', 'events.cpp',
|
||||
'flashlight.cpp', 'GameStudioModelRenderer.cpp', 'geiger.cpp',
|
||||
'health.cpp', 'hud.cpp', 'hud_msg.cpp', 'hud_redraw.cpp',
|
||||
'hud_spectator.cpp', 'hud_update.cpp', 'in_camera.cpp',
|
||||
'input.cpp', 'input_goldsource.cpp', 'input_mouse.cpp',
|
||||
'input_xash3d.cpp', 'menu.cpp', 'message.cpp',
|
||||
'overview.cpp', 'parsemsg.cpp', 'saytext.cpp',
|
||||
'status_icons.cpp', 'statusbar.cpp', 'studio_util.cpp',
|
||||
'StudioModelRenderer.cpp', 'text_message.cpp', 'train.cpp',
|
||||
'tri.cpp', 'util.cpp', 'view.cpp', 'scoreboard.cpp', 'MOTD.cpp'
|
||||
]
|
||||
|
||||
includes = Utils.to_list('. hl/ ../dlls ../dlls/wpn_shared ../common ../engine ../pm_shared ../game_shared ../public ../utils/false_vgui/include')
|
||||
|
||||
defines = ['CLIENT_DLL']
|
||||
if bld.env.GOLDSRC:
|
||||
defines += ['GOLDSOURCE_SUPPORT']
|
||||
|
||||
libs = []
|
||||
if bld.env.GOLDSRC:
|
||||
libs += ['DL']
|
||||
|
||||
if bld.env.DEST_OS2 not in ['android']:
|
||||
install_path = os.path.join(bld.env.GAMEDIR, bld.env.CLIENT_DIR)
|
||||
else:
|
||||
install_path = bld.env.PREFIX
|
||||
|
||||
bld.shlib(
|
||||
source = source,
|
||||
target = 'client',
|
||||
features = 'c cxx',
|
||||
includes = includes,
|
||||
defines = defines,
|
||||
use = libs,
|
||||
install_path = install_path,
|
||||
subsystem = bld.env.MSVC_SUBSYSTEM,
|
||||
idx = 1
|
||||
)
|
@ -30,13 +30,14 @@ add_definitions(-DCLIENT_WEAPONS -DCROWBAR_IDLE_ANIM)
|
||||
if(NOT MSVC)
|
||||
add_compile_options(-fno-exceptions) # GCC/Clang flag
|
||||
add_compile_options(-Wno-invalid-offsetof) # GCC/Clang flag
|
||||
add_compile_options(-fvisibility=hidden) # GCC/Clang flag
|
||||
add_definitions(-D_LINUX) # It seems enough for all non-Win32 systems
|
||||
add_definitions(-Dstricmp=strcasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf )
|
||||
else()
|
||||
add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE)
|
||||
endif()
|
||||
|
||||
set (SVDLL_SOURCES
|
||||
set (SVDLL_SOURCES
|
||||
agrunt.cpp
|
||||
airtank.cpp
|
||||
aflock.cpp
|
||||
@ -149,7 +150,7 @@ set (SVDLL_SOURCES
|
||||
../pm_shared/pm_math.c
|
||||
../pm_shared/pm_shared.c
|
||||
)
|
||||
|
||||
|
||||
include_directories (. wpn_shared ../common ../engine ../pm_shared ../game_shared ../public)
|
||||
|
||||
if(USE_VOICEMGR)
|
||||
|
@ -344,7 +344,7 @@ BOOL CBullsquid::FValidateHintType( short sHint )
|
||||
}
|
||||
}
|
||||
|
||||
ALERT( at_aiconsole, "Couldn't validate hint type" );
|
||||
ALERT( at_aiconsole, "Couldn't validate hint type\n" );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -51,6 +51,7 @@ extern int gmsgSayText;
|
||||
extern int gmsgBhopcap;
|
||||
|
||||
extern cvar_t allow_spectators;
|
||||
extern cvar_t multibyte_only;
|
||||
|
||||
extern int g_teamplay;
|
||||
|
||||
@ -287,6 +288,10 @@ decodeFinishedMaybeCESU8:
|
||||
bool Q_UnicodeValidate( const char *pUTF8 )
|
||||
{
|
||||
bool bError = false;
|
||||
|
||||
if( !multibyte_only.value )
|
||||
return true;
|
||||
|
||||
while( *pUTF8 )
|
||||
{
|
||||
unsigned int uVal;
|
||||
@ -1097,8 +1102,8 @@ void SetupVisibility( edict_t *pViewEntity, edict_t *pClient, unsigned char **pv
|
||||
}
|
||||
}
|
||||
|
||||
*pvs = ENGINE_SET_PVS( (float *)&org );
|
||||
*pas = ENGINE_SET_PAS( (float *)&org );
|
||||
*pvs = ENGINE_SET_PVS( org );
|
||||
*pas = ENGINE_SET_PAS( org );
|
||||
}
|
||||
|
||||
#include "entity_state.h"
|
||||
|
198
dlls/compile.bat
198
dlls/compile.bat
@ -8,105 +8,105 @@ echo -- Compiler is MSVC6
|
||||
|
||||
set XASH3DSRC=..\..\Xash3D_original
|
||||
set INCLUDES=-I../common -I../engine -I../pm_shared -I../game_shared -I../public
|
||||
set SOURCES=agrunt.cpp^
|
||||
airtank.cpp^
|
||||
aflock.cpp^
|
||||
animating.cpp^
|
||||
animation.cpp^
|
||||
apache.cpp^
|
||||
barnacle.cpp^
|
||||
barney.cpp^
|
||||
bigmomma.cpp^
|
||||
bloater.cpp^
|
||||
bmodels.cpp^
|
||||
bullsquid.cpp^
|
||||
buttons.cpp^
|
||||
cbase.cpp^
|
||||
client.cpp^
|
||||
combat.cpp^
|
||||
controller.cpp^
|
||||
crossbow.cpp^
|
||||
crowbar.cpp^
|
||||
defaultai.cpp^
|
||||
doors.cpp^
|
||||
effects.cpp^
|
||||
egon.cpp^
|
||||
explode.cpp^
|
||||
flyingmonster.cpp^
|
||||
func_break.cpp^
|
||||
func_tank.cpp^
|
||||
game.cpp^
|
||||
gamerules.cpp^
|
||||
gargantua.cpp^
|
||||
gauss.cpp^
|
||||
genericmonster.cpp^
|
||||
ggrenade.cpp^
|
||||
globals.cpp^
|
||||
glock.cpp^
|
||||
gman.cpp^
|
||||
h_ai.cpp^
|
||||
h_battery.cpp^
|
||||
h_cine.cpp^
|
||||
h_cycler.cpp^
|
||||
h_export.cpp^
|
||||
handgrenade.cpp^
|
||||
hassassin.cpp^
|
||||
headcrab.cpp^
|
||||
healthkit.cpp^
|
||||
hgrunt.cpp^
|
||||
hornet.cpp^
|
||||
hornetgun.cpp^
|
||||
houndeye.cpp^
|
||||
ichthyosaur.cpp^
|
||||
islave.cpp^
|
||||
items.cpp^
|
||||
leech.cpp^
|
||||
lights.cpp^
|
||||
maprules.cpp^
|
||||
monstermaker.cpp^
|
||||
monsters.cpp^
|
||||
monsterstate.cpp^
|
||||
mortar.cpp^
|
||||
mp5.cpp^
|
||||
multiplay_gamerules.cpp^
|
||||
nihilanth.cpp^
|
||||
nodes.cpp^
|
||||
observer.cpp^
|
||||
osprey.cpp^
|
||||
pathcorner.cpp^
|
||||
plane.cpp^
|
||||
plats.cpp^
|
||||
player.cpp^
|
||||
playermonster.cpp^
|
||||
python.cpp^
|
||||
rat.cpp^
|
||||
roach.cpp^
|
||||
rpg.cpp^
|
||||
satchel.cpp^
|
||||
schedule.cpp^
|
||||
scientist.cpp^
|
||||
scripted.cpp^
|
||||
shotgun.cpp^
|
||||
singleplay_gamerules.cpp^
|
||||
skill.cpp^
|
||||
sound.cpp^
|
||||
soundent.cpp^
|
||||
spectator.cpp^
|
||||
squadmonster.cpp^
|
||||
squeakgrenade.cpp^
|
||||
subs.cpp^
|
||||
talkmonster.cpp^
|
||||
teamplay_gamerules.cpp^
|
||||
tempmonster.cpp^
|
||||
tentacle.cpp^
|
||||
triggers.cpp^
|
||||
tripmine.cpp^
|
||||
turret.cpp^
|
||||
util.cpp^
|
||||
weapons.cpp^
|
||||
world.cpp^
|
||||
xen.cpp^
|
||||
zombie.cpp^
|
||||
set SOURCES=agrunt.cpp ^
|
||||
airtank.cpp ^
|
||||
aflock.cpp ^
|
||||
animating.cpp ^
|
||||
animation.cpp ^
|
||||
apache.cpp ^
|
||||
barnacle.cpp ^
|
||||
barney.cpp ^
|
||||
bigmomma.cpp ^
|
||||
bloater.cpp ^
|
||||
bmodels.cpp ^
|
||||
bullsquid.cpp ^
|
||||
buttons.cpp ^
|
||||
cbase.cpp ^
|
||||
client.cpp ^
|
||||
combat.cpp ^
|
||||
controller.cpp ^
|
||||
crossbow.cpp ^
|
||||
crowbar.cpp ^
|
||||
defaultai.cpp ^
|
||||
doors.cpp ^
|
||||
effects.cpp ^
|
||||
egon.cpp ^
|
||||
explode.cpp ^
|
||||
flyingmonster.cpp ^
|
||||
func_break.cpp ^
|
||||
func_tank.cpp ^
|
||||
game.cpp ^
|
||||
gamerules.cpp ^
|
||||
gargantua.cpp ^
|
||||
gauss.cpp ^
|
||||
genericmonster.cpp ^
|
||||
ggrenade.cpp ^
|
||||
globals.cpp ^
|
||||
glock.cpp ^
|
||||
gman.cpp ^
|
||||
h_ai.cpp ^
|
||||
h_battery.cpp ^
|
||||
h_cine.cpp ^
|
||||
h_cycler.cpp ^
|
||||
h_export.cpp ^
|
||||
handgrenade.cpp ^
|
||||
hassassin.cpp ^
|
||||
headcrab.cpp ^
|
||||
healthkit.cpp ^
|
||||
hgrunt.cpp ^
|
||||
hornet.cpp ^
|
||||
hornetgun.cpp ^
|
||||
houndeye.cpp ^
|
||||
ichthyosaur.cpp ^
|
||||
islave.cpp ^
|
||||
items.cpp ^
|
||||
leech.cpp ^
|
||||
lights.cpp ^
|
||||
maprules.cpp ^
|
||||
monstermaker.cpp ^
|
||||
monsters.cpp ^
|
||||
monsterstate.cpp ^
|
||||
mortar.cpp ^
|
||||
mp5.cpp ^
|
||||
multiplay_gamerules.cpp ^
|
||||
nihilanth.cpp ^
|
||||
nodes.cpp ^
|
||||
observer.cpp ^
|
||||
osprey.cpp ^
|
||||
pathcorner.cpp ^
|
||||
plane.cpp ^
|
||||
plats.cpp ^
|
||||
player.cpp ^
|
||||
playermonster.cpp ^
|
||||
python.cpp ^
|
||||
rat.cpp ^
|
||||
roach.cpp ^
|
||||
rpg.cpp ^
|
||||
satchel.cpp ^
|
||||
schedule.cpp ^
|
||||
scientist.cpp ^
|
||||
scripted.cpp ^
|
||||
shotgun.cpp ^
|
||||
singleplay_gamerules.cpp ^
|
||||
skill.cpp ^
|
||||
sound.cpp ^
|
||||
soundent.cpp ^
|
||||
spectator.cpp ^
|
||||
squadmonster.cpp ^
|
||||
squeakgrenade.cpp ^
|
||||
subs.cpp ^
|
||||
talkmonster.cpp ^
|
||||
teamplay_gamerules.cpp ^
|
||||
tempmonster.cpp ^
|
||||
tentacle.cpp ^
|
||||
triggers.cpp ^
|
||||
tripmine.cpp ^
|
||||
turret.cpp ^
|
||||
util.cpp ^
|
||||
weapons.cpp ^
|
||||
world.cpp ^
|
||||
xen.cpp ^
|
||||
zombie.cpp ^
|
||||
../pm_shared/pm_debug.c ../pm_shared/pm_math.c ../pm_shared/pm_shared.c
|
||||
set DEFINES=/DCLIENT_WEAPONS /Dsnprintf=_snprintf /DNO_VOICEGAMEMGR
|
||||
set LIBS=user32.lib
|
||||
|
@ -373,7 +373,7 @@ void CCrossbow::FireSniperBolt()
|
||||
flags = 0;
|
||||
#endif
|
||||
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usCrossbow2, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType], 0, 0 );
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usCrossbow2, 0.0, g_vecZero, g_vecZero, 0, 0, m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType], 0, 0 );
|
||||
|
||||
// player "shoot" animation
|
||||
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
|
||||
@ -416,7 +416,7 @@ void CCrossbow::FireBolt()
|
||||
flags = 0;
|
||||
#endif
|
||||
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usCrossbow, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType], 0, 0 );
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usCrossbow, 0.0, g_vecZero, g_vecZero, 0, 0, m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType], 0, 0 );
|
||||
|
||||
// player "shoot" animation
|
||||
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
|
||||
|
@ -204,7 +204,7 @@ int CCrowbar::Swing( int fFirst )
|
||||
if( fFirst )
|
||||
{
|
||||
PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usCrowbar,
|
||||
0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0,
|
||||
0.0, g_vecZero, g_vecZero, 0, 0, 0,
|
||||
0, 0, 0 );
|
||||
}
|
||||
|
||||
|
@ -926,6 +926,7 @@ public:
|
||||
void Spawn( void );
|
||||
void Precache( void );
|
||||
void EXPORT MomentaryMoveDone( void );
|
||||
void EXPORT StopMoveSound( void );
|
||||
|
||||
void KeyValue( KeyValueData *pkvd );
|
||||
void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
|
||||
@ -1117,7 +1118,15 @@ void CMomentaryDoor::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYP
|
||||
}
|
||||
|
||||
void CMomentaryDoor::MomentaryMoveDone( void )
|
||||
{
|
||||
SetThink(&CMomentaryDoor::StopMoveSound);
|
||||
pev->nextthink = pev->ltime + 0.1;
|
||||
}
|
||||
|
||||
void CMomentaryDoor::StopMoveSound()
|
||||
{
|
||||
STOP_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseMoving ) );
|
||||
EMIT_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseArrived ), 1, ATTN_NORM );
|
||||
pev->nextthink = -1;
|
||||
ResetThink();
|
||||
}
|
||||
|
@ -197,7 +197,7 @@ void CEgon::Attack( void )
|
||||
|
||||
m_flAmmoUseTime = gpGlobals->time;// start using ammo ASAP.
|
||||
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usEgonFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, m_fireState, m_fireMode, 1, 0 );
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usEgonFire, 0.0, g_vecZero, g_vecZero, 0.0, 0.0, m_fireState, m_fireMode, 1, 0 );
|
||||
|
||||
m_shakeTime = 0;
|
||||
|
||||
@ -216,7 +216,7 @@ void CEgon::Attack( void )
|
||||
|
||||
if( pev->fuser1 <= UTIL_WeaponTimeBase() )
|
||||
{
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usEgonFire, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, m_fireState, m_fireMode, 0, 0 );
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usEgonFire, 0, g_vecZero, g_vecZero, 0.0, 0.0, m_fireState, m_fireMode, 0, 0 );
|
||||
pev->fuser1 = 1000;
|
||||
}
|
||||
|
||||
@ -504,7 +504,7 @@ void CEgon::EndAttack( void )
|
||||
if( m_fireState != FIRE_OFF ) //Checking the button just in case!.
|
||||
bMakeNoise = true;
|
||||
|
||||
PLAYBACK_EVENT_FULL( FEV_GLOBAL | FEV_RELIABLE, m_pPlayer->edict(), m_usEgonStop, 0, (float *)&m_pPlayer->pev->origin, (float *)&m_pPlayer->pev->angles, 0.0, 0.0, bMakeNoise, 0, 0, 0 );
|
||||
PLAYBACK_EVENT_FULL( FEV_GLOBAL | FEV_RELIABLE, m_pPlayer->edict(), m_usEgonStop, 0, m_pPlayer->pev->origin, m_pPlayer->pev->angles, 0.0, 0.0, bMakeNoise, 0, 0, 0 );
|
||||
|
||||
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 2.0;
|
||||
m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.5;
|
||||
|
@ -62,6 +62,7 @@ typedef int BOOL;
|
||||
// Misc C-runtime library headers
|
||||
#include "stdio.h"
|
||||
#include "stdlib.h"
|
||||
#include "stddef.h"
|
||||
#include "math.h"
|
||||
|
||||
#if defined(__LP64__) || defined(__LLP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)
|
||||
|
@ -31,6 +31,7 @@ cvar_t friendlyfire = { "mp_friendlyfire","0", FCVAR_SERVER };
|
||||
cvar_t falldamage = { "mp_falldamage","0", FCVAR_SERVER };
|
||||
cvar_t weaponstay = { "mp_weaponstay","0", FCVAR_SERVER };
|
||||
cvar_t selfgauss = { "mp_selfgauss", "1", FCVAR_SERVER };
|
||||
cvar_t chargerfix = { "mp_chargerfix", "0", FCVAR_SERVER };
|
||||
cvar_t satchelfix = { "mp_satchelfix", "0", FCVAR_SERVER };
|
||||
cvar_t forcerespawn = { "mp_forcerespawn","1", FCVAR_SERVER };
|
||||
cvar_t flashlight = { "mp_flashlight","0", FCVAR_SERVER };
|
||||
@ -43,6 +44,7 @@ cvar_t allowmonsters = { "mp_allowmonsters","0", FCVAR_SERVER };
|
||||
cvar_t bhopcap = { "mp_bhopcap", "1", FCVAR_SERVER };
|
||||
|
||||
cvar_t allow_spectators = { "allow_spectators", "0", FCVAR_SERVER }; // 0 prevents players from being spectators
|
||||
cvar_t multibyte_only = { "mp_multibyte_only", "0", FCVAR_SERVER };
|
||||
|
||||
cvar_t mp_chattime = { "mp_chattime","10", FCVAR_SERVER };
|
||||
|
||||
@ -548,6 +550,7 @@ void GameDLLInit( void )
|
||||
CVAR_REGISTER( &falldamage );
|
||||
CVAR_REGISTER( &weaponstay );
|
||||
CVAR_REGISTER( &selfgauss );
|
||||
CVAR_REGISTER( &chargerfix );
|
||||
CVAR_REGISTER( &satchelfix );
|
||||
CVAR_REGISTER( &forcerespawn );
|
||||
CVAR_REGISTER( &flashlight );
|
||||
@ -558,6 +561,7 @@ void GameDLLInit( void )
|
||||
CVAR_REGISTER( &defaultteam );
|
||||
CVAR_REGISTER( &allowmonsters );
|
||||
CVAR_REGISTER( &bhopcap );
|
||||
CVAR_REGISTER( &multibyte_only );
|
||||
|
||||
CVAR_REGISTER( &mp_chattime );
|
||||
|
||||
|
@ -28,6 +28,7 @@ extern cvar_t friendlyfire;
|
||||
extern cvar_t falldamage;
|
||||
extern cvar_t weaponstay;
|
||||
extern cvar_t selfgauss;
|
||||
extern cvar_t chargerfix;
|
||||
extern cvar_t satchelfix;
|
||||
extern cvar_t forcerespawn;
|
||||
extern cvar_t flashlight;
|
||||
|
@ -138,7 +138,7 @@ BOOL CGauss::Deploy()
|
||||
|
||||
void CGauss::Holster( int skiplocal /* = 0 */ )
|
||||
{
|
||||
PLAYBACK_EVENT_FULL( FEV_RELIABLE | FEV_GLOBAL, m_pPlayer->edict(), m_usGaussFire, 0.01, (float *)&m_pPlayer->pev->origin, (float *)&m_pPlayer->pev->angles, 0.0, 0.0, 0, 0, 0, 1 );
|
||||
PLAYBACK_EVENT_FULL( FEV_RELIABLE | FEV_GLOBAL, m_pPlayer->edict(), m_usGaussFire, 0.01, m_pPlayer->pev->origin, m_pPlayer->pev->angles, 0.0, 0.0, 0, 0, 0, 1 );
|
||||
|
||||
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5;
|
||||
|
||||
@ -217,7 +217,7 @@ void CGauss::SecondaryAttack()
|
||||
m_pPlayer->m_flStartCharge = gpGlobals->time;
|
||||
m_pPlayer->m_flAmmoStartCharge = UTIL_WeaponTimeBase() + GetFullChargeTime();
|
||||
|
||||
PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usGaussSpin, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 110, 0, 0, 0 );
|
||||
PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usGaussSpin, 0.0, g_vecZero, g_vecZero, 0.0, 0.0, 110, 0, 0, 0 );
|
||||
|
||||
m_iSoundState = SND_CHANGE_PITCH;
|
||||
}
|
||||
@ -281,7 +281,7 @@ void CGauss::SecondaryAttack()
|
||||
if( m_iSoundState == 0 )
|
||||
ALERT( at_console, "sound state %d\n", m_iSoundState );
|
||||
|
||||
PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usGaussSpin, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, pitch, 0, ( m_iSoundState == SND_CHANGE_PITCH ) ? 1 : 0, 0 );
|
||||
PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usGaussSpin, 0.0, g_vecZero, g_vecZero, 0.0, 0.0, pitch, 0, ( m_iSoundState == SND_CHANGE_PITCH ) ? 1 : 0, 0 );
|
||||
|
||||
m_iSoundState = SND_CHANGE_PITCH; // hack for going through level transitions
|
||||
|
||||
@ -389,13 +389,13 @@ void CGauss::Fire( Vector vecOrigSrc, Vector vecDir, float flDamage )
|
||||
g_irunninggausspred = true;
|
||||
#endif
|
||||
// The main firing event is sent unreliably so it won't be delayed.
|
||||
PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usGaussFire, 0.0, (float *)&m_pPlayer->pev->origin, (float *)&m_pPlayer->pev->angles, flDamage, 0.0, 0, 0, m_fPrimaryFire ? 1 : 0, 0 );
|
||||
PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usGaussFire, 0.0, m_pPlayer->pev->origin, m_pPlayer->pev->angles, flDamage, 0.0, 0, 0, m_fPrimaryFire ? 1 : 0, 0 );
|
||||
|
||||
// This reliable event is used to stop the spinning sound
|
||||
// It's delayed by a fraction of second to make sure it is delayed by 1 frame on the client
|
||||
// It's sent reliably anyway, which could lead to other delays
|
||||
|
||||
PLAYBACK_EVENT_FULL( FEV_NOTHOST | FEV_RELIABLE, m_pPlayer->edict(), m_usGaussFire, 0.01, (float *)&m_pPlayer->pev->origin, (float *)&m_pPlayer->pev->angles, 0.0, 0.0, 0, 0, 0, 1 );
|
||||
PLAYBACK_EVENT_FULL( FEV_NOTHOST | FEV_RELIABLE, m_pPlayer->edict(), m_usGaussFire, 0.01, m_pPlayer->pev->origin, m_pPlayer->pev->angles, 0.0, 0.0, 0, 0, 0, 1 );
|
||||
|
||||
/*ALERT( at_console, "%f %f %f\n%f %f %f\n",
|
||||
vecSrc.x, vecSrc.y, vecSrc.z,
|
||||
|
@ -168,7 +168,7 @@ void CGlock::GlockFire( float flSpread, float flCycleTime, BOOL fUseAutoAim )
|
||||
Vector vecDir;
|
||||
vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, Vector( flSpread, flSpread, flSpread ), 8192, BULLET_PLAYER_9MM, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );
|
||||
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), fUseAutoAim ? m_usFireGlock1 : m_usFireGlock2, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, ( m_iClip == 0 ) ? 1 : 0, 0 );
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), fUseAutoAim ? m_usFireGlock1 : m_usFireGlock2, 0.0, g_vecZero, g_vecZero, vecDir.x, vecDir.y, 0, 0, ( m_iClip == 0 ) ? 1 : 0, 0 );
|
||||
|
||||
m_flNextPrimaryAttack = m_flNextSecondaryAttack = GetNextAttackDelay( flCycleTime );
|
||||
|
||||
|
@ -26,6 +26,8 @@
|
||||
#include "saverestore.h"
|
||||
#include "skill.h"
|
||||
#include "gamerules.h"
|
||||
#include "weapons.h"
|
||||
#include "game.h"
|
||||
|
||||
class CRecharge : public CBaseToggle
|
||||
{
|
||||
@ -116,7 +118,7 @@ void CRecharge::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use
|
||||
}
|
||||
|
||||
// if the player doesn't have the suit, or there is no juice left, make the deny noise
|
||||
if( ( m_iJuice <= 0 ) || ( !( pActivator->pev->weapons & ( 1 << WEAPON_SUIT ) ) ) )
|
||||
if( ( m_iJuice <= 0 ) || ( !( pActivator->pev->weapons & ( 1 << WEAPON_SUIT ) ) ) || ( ( chargerfix.value ) && ( pActivator->pev->armorvalue == MAX_NORMAL_BATTERY ) ) )
|
||||
{
|
||||
if( m_flSoundTime <= gpGlobals->time )
|
||||
{
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include "player.h"
|
||||
#include "items.h"
|
||||
#include "gamerules.h"
|
||||
#include "game.h"
|
||||
|
||||
extern int gmsgItemPickup;
|
||||
|
||||
@ -187,7 +188,7 @@ void CWallHealth::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE u
|
||||
}
|
||||
|
||||
// if the player doesn't have the suit, or there is no juice left, make the deny noise
|
||||
if( ( m_iJuice <= 0 ) || ( !( pActivator->pev->weapons & ( 1 << WEAPON_SUIT ) ) ) )
|
||||
if( ( m_iJuice <= 0 ) || ( !( pActivator->pev->weapons & ( 1 << WEAPON_SUIT ) ) ) || ( ( chargerfix.value ) && ( pActivator->pev->health >= pActivator->pev->max_health ) ) )
|
||||
{
|
||||
if( m_flSoundTime <= gpGlobals->time )
|
||||
{
|
||||
|
@ -150,7 +150,7 @@ void CHgun::PrimaryAttack()
|
||||
#else
|
||||
flags = 0;
|
||||
#endif
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usHornetFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, FIREMODE_TRACK, 0, 0, 0 );
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usHornetFire, 0.0, g_vecZero, g_vecZero, 0.0, 0.0, FIREMODE_TRACK, 0, 0, 0 );
|
||||
|
||||
// player "shoot" animation
|
||||
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
|
||||
@ -231,7 +231,7 @@ void CHgun::SecondaryAttack( void )
|
||||
#else
|
||||
flags = 0;
|
||||
#endif
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usHornetFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, FIREMODE_FAST, 0, 0, 0 );
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usHornetFire, 0.0, g_vecZero, g_vecZero, 0.0, 0.0, FIREMODE_FAST, 0, 0, 0 );
|
||||
|
||||
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--;
|
||||
m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME;
|
||||
|
@ -155,7 +155,7 @@ BOOL CHoundeye::FValidateHintType( short sHint )
|
||||
}
|
||||
}
|
||||
|
||||
ALERT( at_aiconsole, "Couldn't validate hint type" );
|
||||
ALERT( at_aiconsole, "Couldn't validate hint type\n" );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -1208,13 +1208,19 @@ void CBaseMonster::SetActivity( Activity NewActivity )
|
||||
|
||||
iSequence = LookupActivity( NewActivity );
|
||||
|
||||
Activity OldActivity = m_Activity;
|
||||
m_Activity = NewActivity; // Go ahead and set this so it doesn't keep trying when the anim is not present
|
||||
|
||||
// In case someone calls this with something other than the ideal activity
|
||||
m_IdealActivity = m_Activity;
|
||||
|
||||
// Set to the desired anim, or default anim if the desired is not present
|
||||
if( iSequence > ACTIVITY_NOT_AVAILABLE )
|
||||
{
|
||||
if( pev->sequence != iSequence || !m_fSequenceLoops )
|
||||
{
|
||||
// don't reset frame between walk and run
|
||||
if( !( m_Activity == ACT_WALK || m_Activity == ACT_RUN ) || !( NewActivity == ACT_WALK || NewActivity == ACT_RUN ) )
|
||||
if( !( OldActivity == ACT_WALK || OldActivity == ACT_RUN ) || !( NewActivity == ACT_WALK || NewActivity == ACT_RUN ) )
|
||||
pev->frame = 0;
|
||||
}
|
||||
|
||||
@ -1228,11 +1234,6 @@ void CBaseMonster::SetActivity( Activity NewActivity )
|
||||
ALERT( at_aiconsole, "%s has no sequence for act:%d\n", STRING( pev->classname ), NewActivity );
|
||||
pev->sequence = 0; // Set to the reset anim (if it's there)
|
||||
}
|
||||
|
||||
m_Activity = NewActivity; // Go ahead and set this so it doesn't keep trying when the anim is not present
|
||||
|
||||
// In case someone calls this with something other than the ideal activity
|
||||
m_IdealActivity = m_Activity;
|
||||
}
|
||||
|
||||
//=========================================================
|
||||
|
@ -171,7 +171,7 @@ void CMP5::PrimaryAttack()
|
||||
#else
|
||||
flags = 0;
|
||||
#endif
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usMP5, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usMP5, 0.0, g_vecZero, g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );
|
||||
|
||||
if( !m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
|
||||
// HEV suit - indicate out of ammo condition
|
||||
|
119
dlls/nodes.cpp
119
dlls/nodes.cpp
@ -21,6 +21,7 @@
|
||||
#include "cbase.h"
|
||||
#include "monsters.h"
|
||||
#include "nodes.h"
|
||||
#include "nodes_compat.h"
|
||||
#include "animation.h"
|
||||
#include "doors.h"
|
||||
|
||||
@ -44,9 +45,7 @@ LINK_ENTITY_TO_CLASS( info_node_air, CNodeEnt )
|
||||
#if !defined _WIN32
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#define CreateDirectory(p, n) mkdir(p, 0777)
|
||||
#else
|
||||
#define CreateDirectory(p, n) CreateDirectoryA(p, n)
|
||||
#define CreateDirectoryA(p, n) mkdir(p, 0777)
|
||||
#endif
|
||||
|
||||
//=========================================================
|
||||
@ -1701,9 +1700,9 @@ void CTestHull::BuildNodeGraph( void )
|
||||
// make sure directories have been made
|
||||
GET_GAME_DIR( szNrpFilename );
|
||||
strcat( szNrpFilename, "/maps" );
|
||||
CreateDirectory( szNrpFilename, NULL );
|
||||
CreateDirectoryA( szNrpFilename, NULL );
|
||||
strcat( szNrpFilename, "/graphs" );
|
||||
CreateDirectory( szNrpFilename, NULL );
|
||||
CreateDirectoryA( szNrpFilename, NULL );
|
||||
|
||||
strcat( szNrpFilename, "/" );
|
||||
strcat( szNrpFilename, STRING( gpGlobals->mapname ) );
|
||||
@ -2375,9 +2374,9 @@ int CGraph::FLoadGraph( const char *szMapName )
|
||||
char szDirName[MAX_PATH];
|
||||
GET_GAME_DIR( szDirName );
|
||||
strcat( szDirName, "/maps" );
|
||||
CreateDirectory( szDirName, NULL );
|
||||
CreateDirectoryA( szDirName, NULL );
|
||||
strcat( szDirName, "/graphs" );
|
||||
CreateDirectory( szDirName, NULL );
|
||||
CreateDirectoryA( szDirName, NULL );
|
||||
|
||||
strcpy( szFilename, "maps/graphs/" );
|
||||
strcat( szFilename, szMapName );
|
||||
@ -2386,42 +2385,47 @@ int CGraph::FLoadGraph( const char *szMapName )
|
||||
pMemFile = aMemFile = LOAD_FILE_FOR_ME( szFilename, &length );
|
||||
|
||||
if( !aMemFile )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
|
||||
// Read the graph version number
|
||||
//
|
||||
length -= sizeof(int);
|
||||
if( length < 0 )
|
||||
goto ShortFile;
|
||||
iVersion = *(int *) pMemFile;
|
||||
pMemFile += sizeof(int);
|
||||
|
||||
if( iVersion == GRAPH_VERSION || iVersion == GRAPH_VERSION_RETAIL )
|
||||
{
|
||||
// Read the graph version number
|
||||
//
|
||||
length -= sizeof(int);
|
||||
if( length < 0 )
|
||||
goto ShortFile;
|
||||
memcpy( &iVersion, pMemFile, sizeof(int) );
|
||||
pMemFile += sizeof(int);
|
||||
|
||||
if( iVersion != GRAPH_VERSION )
|
||||
{
|
||||
// This file was written by a different build of the dll!
|
||||
//
|
||||
ALERT( at_aiconsole, "**ERROR** Graph version is %d, expected %d\n", iVersion, GRAPH_VERSION );
|
||||
goto ShortFile;
|
||||
}
|
||||
|
||||
// Read the graph class
|
||||
//
|
||||
length -= sizeof(CGraph);
|
||||
if( length < 0 )
|
||||
goto ShortFile;
|
||||
memcpy( this, pMemFile, sizeof(CGraph) );
|
||||
pMemFile += sizeof(CGraph);
|
||||
if ( iVersion == GRAPH_VERSION )
|
||||
{
|
||||
length -= sizeof(CGraph);
|
||||
if( length < 0 )
|
||||
goto ShortFile;
|
||||
memcpy( this, pMemFile, sizeof(CGraph) );
|
||||
pMemFile += sizeof(CGraph);
|
||||
|
||||
// Set the pointers to zero, just in case we run out of memory.
|
||||
//
|
||||
m_pNodes = NULL;
|
||||
m_pLinkPool = NULL;
|
||||
m_di = NULL;
|
||||
m_pRouteInfo = NULL;
|
||||
m_pHashLinks = NULL;
|
||||
// Set the pointers to zero, just in case we run out of memory.
|
||||
//
|
||||
m_pNodes = NULL;
|
||||
m_pLinkPool = NULL;
|
||||
m_di = NULL;
|
||||
m_pRouteInfo = NULL;
|
||||
m_pHashLinks = NULL;
|
||||
}
|
||||
#if _GRAPH_VERSION != _GRAPH_VERSION_RETAIL
|
||||
else
|
||||
{
|
||||
ALERT( at_aiconsole, "Loading CGraph in GRAPH_VERSION 16 compatibility mode\n" );
|
||||
length -= sizeof(CGraph_Retail);
|
||||
if( length < 0 )
|
||||
goto ShortFile;
|
||||
reinterpret_cast<CGraph_Retail*>(pMemFile) -> copyOverTo(this);
|
||||
pMemFile += sizeof(CGraph_Retail);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Malloc for the nodes
|
||||
//
|
||||
@ -2453,11 +2457,25 @@ int CGraph::FLoadGraph( const char *szMapName )
|
||||
|
||||
// Read in all the links
|
||||
//
|
||||
length -= sizeof(CLink) * m_cLinks;
|
||||
if( length < 0 )
|
||||
goto ShortFile;
|
||||
memcpy( m_pLinkPool, pMemFile, sizeof(CLink) * m_cLinks );
|
||||
pMemFile += sizeof(CLink) * m_cLinks;
|
||||
if( iVersion == GRAPH_VERSION )
|
||||
{
|
||||
length -= sizeof(CLink) * m_cLinks;
|
||||
if( length < 0 )
|
||||
goto ShortFile;
|
||||
memcpy( m_pLinkPool, pMemFile, sizeof(CLink) * m_cLinks );
|
||||
pMemFile += sizeof(CLink) * m_cLinks;
|
||||
}
|
||||
#if _GRAPH_VERSION != _GRAPH_VERSION_RETAIL
|
||||
else
|
||||
{
|
||||
ALERT( at_aiconsole, "Loading CLink array in GRAPH_VERSION 16 compatibility mode\n" );
|
||||
length -= sizeof(CLink_Retail) * m_cLinks;
|
||||
if( length < 0 )
|
||||
goto ShortFile;
|
||||
reinterpret_cast<CLink_Retail*>(pMemFile) -> copyOverTo(m_pLinkPool);
|
||||
pMemFile += sizeof(CLink_Retail) * m_cLinks;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Malloc for the sorting info.
|
||||
//
|
||||
@ -2482,7 +2500,7 @@ int CGraph::FLoadGraph( const char *szMapName )
|
||||
m_pRouteInfo = (signed char *)calloc( sizeof(signed char), m_nRouteInfo );
|
||||
if( !m_pRouteInfo )
|
||||
{
|
||||
ALERT( at_aiconsole, "***ERROR**\nCounldn't malloc %d route bytes!\n", m_nRouteInfo );
|
||||
ALERT( at_aiconsole, "***ERROR**\nCouldn't malloc %d route bytes!\n", m_nRouteInfo );
|
||||
goto NoMemory;
|
||||
}
|
||||
m_CheckedCounter = 0;
|
||||
@ -2505,7 +2523,7 @@ int CGraph::FLoadGraph( const char *szMapName )
|
||||
m_pHashLinks = (short *)calloc( sizeof(short), m_nHashLinks );
|
||||
if( !m_pHashLinks )
|
||||
{
|
||||
ALERT( at_aiconsole, "***ERROR**\nCounldn't malloc %d hash link bytes!\n", m_nHashLinks );
|
||||
ALERT( at_aiconsole, "***ERROR**\nCouldn't malloc %d hash link bytes!\n", m_nHashLinks );
|
||||
goto NoMemory;
|
||||
}
|
||||
|
||||
@ -2531,6 +2549,13 @@ int CGraph::FLoadGraph( const char *szMapName )
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
// This file was written by a different build of the dll!
|
||||
//
|
||||
ALERT( at_aiconsole, "**ERROR** Graph version is %d, expected %d\n", iVersion, GRAPH_VERSION );
|
||||
goto ShortFile;
|
||||
}
|
||||
|
||||
ShortFile:
|
||||
NoMemory:
|
||||
@ -2558,9 +2583,9 @@ int CGraph::FSaveGraph( const char *szMapName )
|
||||
// make sure directories have been made
|
||||
GET_GAME_DIR( szFilename );
|
||||
strcat( szFilename, "/maps" );
|
||||
CreateDirectory( szFilename, NULL );
|
||||
CreateDirectoryA( szFilename, NULL );
|
||||
strcat( szFilename, "/graphs" );
|
||||
CreateDirectory( szFilename, NULL );
|
||||
CreateDirectoryA( szFilename, NULL );
|
||||
|
||||
strcat( szFilename, "/" );
|
||||
strcat( szFilename, szMapName );
|
||||
|
@ -105,11 +105,14 @@ typedef struct
|
||||
//=========================================================
|
||||
// CGraph
|
||||
//=========================================================
|
||||
#define _GRAPH_VERSION_RETAIL 16 // Retail Half-Life graph version. Don't increment this
|
||||
#ifdef XASH_64BIT
|
||||
#define GRAPH_VERSION (int)16 * 10
|
||||
#define _GRAPH_VERSION (16 * 10)
|
||||
#else
|
||||
#define GRAPH_VERSION (int)16// !!!increment this whever graph/node/link classes change, to obsolesce older disk files.
|
||||
#define _GRAPH_VERSION (16) // !!!increment this whenever graph/node/link classes change, to obsolesce older disk files.
|
||||
#endif
|
||||
#define GRAPH_VERSION (int)_GRAPH_VERSION
|
||||
#define GRAPH_VERSION_RETAIL (int)_GRAPH_VERSION_RETAIL
|
||||
|
||||
class CGraph
|
||||
{
|
||||
|
143
dlls/nodes_compat.h
Normal file
143
dlls/nodes_compat.h
Normal file
@ -0,0 +1,143 @@
|
||||
|
||||
#pragma once
|
||||
#ifndef NODES_32BIT_COMPAT
|
||||
#define NODES_32BIT_COMPAT
|
||||
|
||||
//#include "nodes.h"
|
||||
|
||||
#if _GRAPH_VERSION != _GRAPH_VERSION_RETAIL
|
||||
|
||||
#include "stdint.h"
|
||||
|
||||
typedef int32_t PTR32;
|
||||
|
||||
class CGraph_Retail
|
||||
{
|
||||
public:
|
||||
|
||||
BOOL m_fGraphPresent;
|
||||
BOOL m_fGraphPointersSet;
|
||||
BOOL m_fRoutingComplete;
|
||||
|
||||
PTR32 m_pNodes; // CNode*
|
||||
PTR32 m_pLinkPool; // CLink*
|
||||
PTR32 m_pRouteInfo; // signed char*
|
||||
|
||||
int m_cNodes;
|
||||
int m_cLinks;
|
||||
int m_nRouteInfo;
|
||||
|
||||
PTR32 m_di; // DIST_INFO*
|
||||
int m_RangeStart[3][NUM_RANGES];
|
||||
int m_RangeEnd[3][NUM_RANGES];
|
||||
float m_flShortest;
|
||||
int m_iNearest;
|
||||
int m_minX, m_minY, m_minZ, m_maxX, m_maxY, m_maxZ;
|
||||
int m_minBoxX, m_minBoxY, m_minBoxZ, m_maxBoxX, m_maxBoxY, m_maxBoxZ;
|
||||
int m_CheckedCounter;
|
||||
float m_RegionMin[3], m_RegionMax[3];
|
||||
CACHE_ENTRY m_Cache[CACHE_SIZE];
|
||||
|
||||
|
||||
int m_HashPrimes[16];
|
||||
PTR32 m_pHashLinks; // short*
|
||||
int m_nHashLinks;
|
||||
|
||||
int m_iLastActiveIdleSearch;
|
||||
|
||||
int m_iLastCoverSearch;
|
||||
|
||||
|
||||
void copyOverTo(CGraph *other) {
|
||||
other->m_fGraphPresent = m_fGraphPresent;
|
||||
other->m_fGraphPointersSet = m_fGraphPointersSet;
|
||||
other->m_fRoutingComplete = m_fRoutingComplete;
|
||||
|
||||
other->m_pNodes = NULL;
|
||||
other->m_pLinkPool = NULL;
|
||||
other->m_pRouteInfo = NULL;
|
||||
|
||||
other->m_cNodes = m_cNodes;
|
||||
other->m_cLinks = m_cLinks;
|
||||
other->m_nRouteInfo = m_nRouteInfo;
|
||||
|
||||
other->m_di = NULL;
|
||||
|
||||
memcpy( (void *) &other->m_RangeStart, (void *) m_RangeStart,
|
||||
offsetof(class CGraph, m_pHashLinks) - offsetof(class CGraph, m_RangeStart) );
|
||||
|
||||
#if 0 // replacement routine in case a change in CGraph breaks the above memcpy
|
||||
for (int i = 0; i < 3; ++i)
|
||||
for (int j = 0; j < NUM_RANGES; ++j)
|
||||
other->m_RangeStart[i][j] = m_RangeStart[i][j];
|
||||
// m_RangeStart[3][NUM_RANGES]
|
||||
for (int i = 0; i < 3; ++i)
|
||||
for (int j = 0; j < NUM_RANGES; ++j)
|
||||
other->m_RangeEnd[i][j] = m_RangeEnd[i][j];
|
||||
// m_RangeEnd[3][NUM_RANGES]
|
||||
other->m_flShortest = m_flShortest;
|
||||
other->m_iNearest = m_iNearest;
|
||||
other->m_minX = m_minX;
|
||||
other->m_minY = m_minY;
|
||||
other->m_minZ = m_minZ;
|
||||
other->m_maxX = m_maxX;
|
||||
other->m_maxY = m_maxY;
|
||||
other->m_maxZ = m_maxZ;
|
||||
other->m_minBoxX = m_minBoxX;
|
||||
other->m_minBoxY = m_minBoxY;
|
||||
other->m_minBoxZ = m_minBoxZ;
|
||||
other->m_maxBoxX = m_maxBoxX;
|
||||
other->m_maxBoxY = m_maxBoxY;
|
||||
other->m_maxBoxZ = m_maxBoxZ;
|
||||
other->m_CheckedCounter = m_CheckedCounter;
|
||||
for (int i = 0; i < 3; ++i)
|
||||
other->m_RegionMin[i] = m_RegionMin[i];
|
||||
// m_RegionMin[3]
|
||||
for (int i = 0; i < 3; ++i)
|
||||
other->m_RegionMax[i] = m_RegionMax[i];
|
||||
// m_RegionMax[3]
|
||||
for (int i = 0; i < CACHE_SIZE; ++i)
|
||||
other->m_Cache[i] = m_Cache[i];
|
||||
// m_Cache[CACHE_SIZE]
|
||||
for (int i = 0; i < 16; ++i)
|
||||
other->m_HashPrimes[i] = m_HashPrimes[i];
|
||||
// m_HashPrimes[16]
|
||||
#endif
|
||||
|
||||
other->m_pHashLinks = NULL;
|
||||
other->m_nHashLinks = m_nHashLinks;
|
||||
|
||||
other->m_iLastActiveIdleSearch = m_iLastActiveIdleSearch;
|
||||
|
||||
other->m_iLastCoverSearch = m_iLastCoverSearch;
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
class CLink_Retail
|
||||
{
|
||||
|
||||
public:
|
||||
int m_iSrcNode;
|
||||
int m_iDestNode;
|
||||
PTR32 m_pLinkEnt; // entvars_t*
|
||||
char m_szLinkEntModelname[ 4 ];
|
||||
int m_afLinkInfo;
|
||||
float m_flWeight;
|
||||
|
||||
void copyOverTo(CLink* other) {
|
||||
other->m_iSrcNode = m_iSrcNode;
|
||||
other->m_iDestNode = m_iDestNode ;
|
||||
other->m_pLinkEnt = NULL;
|
||||
for (int i = 0; i < 4; ++i)
|
||||
other->m_szLinkEntModelname[i] = m_szLinkEntModelname[i];
|
||||
// m_szLinkEntModelname[ 4 ]
|
||||
other->m_afLinkInfo = m_afLinkInfo;
|
||||
other->m_flWeight = m_flWeight;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif
|
@ -1059,7 +1059,7 @@ void CFuncTrackTrain::StopSound( void )
|
||||
us_encode = us_sound;
|
||||
|
||||
PLAYBACK_EVENT_FULL( FEV_RELIABLE | FEV_UPDATE, edict(), m_usAdjustPitch, 0.0,
|
||||
(float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, us_encode, 0, 1, 0 );
|
||||
g_vecZero, g_vecZero, 0.0, 0.0, us_encode, 0, 1, 0 );
|
||||
/*
|
||||
STOP_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noise ) );
|
||||
*/
|
||||
@ -1107,7 +1107,7 @@ void CFuncTrackTrain::UpdateSound( void )
|
||||
us_encode = us_sound | us_pitch | us_volume;
|
||||
|
||||
PLAYBACK_EVENT_FULL( FEV_RELIABLE | FEV_UPDATE, edict(), m_usAdjustPitch, 0.0,
|
||||
(float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, us_encode, 0, 0, 0 );
|
||||
g_vecZero, g_vecZero, 0.0, 0.0, us_encode, 0, 0, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -200,7 +200,7 @@ void CPython::PrimaryAttack()
|
||||
#else
|
||||
flags = 0;
|
||||
#endif
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usFirePython, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usFirePython, 0.0, g_vecZero, g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );
|
||||
|
||||
if( !m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
|
||||
// HEV suit - indicate out of ammo condition
|
||||
|
@ -720,12 +720,6 @@ void CScientist::TalkInit()
|
||||
int numHeads = FClassnameIs( pev, "monster_cleansuit_scientist" ) ? NUM_CLEANSUIT_SCIENTIST_HEADS : NUM_SCIENTIST_HEADS;
|
||||
CTalkMonster::TalkInit();
|
||||
|
||||
// scientist will try to talk to friends in this order:
|
||||
|
||||
m_szFriends[0] = "monster_scientist";
|
||||
m_szFriends[1] = "monster_sitting_scientist";
|
||||
m_szFriends[2] = "monster_barney";
|
||||
|
||||
// scientists speach group names (group names are in sentences.txt)
|
||||
|
||||
m_szGrp[TLK_ANSWER] = "SC_ANSWER";
|
||||
|
@ -166,7 +166,7 @@ void CShotgun::PrimaryAttack()
|
||||
vecDir = m_pPlayer->FireBulletsPlayer( 6, vecSrc, vecAiming, VECTOR_CONE_10DEGREES, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );
|
||||
}
|
||||
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usSingleFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usSingleFire, 0.0, g_vecZero, g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );
|
||||
|
||||
if( !m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
|
||||
// HEV suit - indicate out of ammo condition
|
||||
@ -237,7 +237,7 @@ void CShotgun::SecondaryAttack( void )
|
||||
vecDir = m_pPlayer->FireBulletsPlayer( 12, vecSrc, vecAiming, VECTOR_CONE_10DEGREES, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );
|
||||
}
|
||||
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usDoubleFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usDoubleFire, 0.0, g_vecZero, g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );
|
||||
|
||||
if( !m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
|
||||
// HEV suit - indicate out of ammo condition
|
||||
|
@ -1037,9 +1037,8 @@ void USENTENCEG_InitLRU( unsigned char *plru, int count )
|
||||
|
||||
int USENTENCEG_PickSequential( int isentenceg, char *szfound, int ipick, int freset )
|
||||
{
|
||||
char *szgroupname;
|
||||
const char *szgroupname;
|
||||
unsigned char count;
|
||||
char sznum[8];
|
||||
|
||||
if( !fSentencesInit )
|
||||
return -1;
|
||||
@ -1056,10 +1055,7 @@ int USENTENCEG_PickSequential( int isentenceg, char *szfound, int ipick, int fre
|
||||
if( ipick >= count )
|
||||
ipick = count - 1;
|
||||
|
||||
strcpy( szfound, "!" );
|
||||
strcat( szfound, szgroupname );
|
||||
sprintf( sznum, "%d", ipick );
|
||||
strcat( szfound, sznum );
|
||||
sprintf( szfound, "!%s%d", szgroupname, ipick );
|
||||
|
||||
if( ipick >= count )
|
||||
{
|
||||
@ -1083,11 +1079,10 @@ int USENTENCEG_PickSequential( int isentenceg, char *szfound, int ipick, int fre
|
||||
|
||||
int USENTENCEG_Pick( int isentenceg, char *szfound )
|
||||
{
|
||||
char *szgroupname;
|
||||
const char *szgroupname;
|
||||
unsigned char *plru;
|
||||
unsigned char i;
|
||||
unsigned char count;
|
||||
char sznum[8];
|
||||
unsigned char ipick;
|
||||
int ffound = FALSE;
|
||||
|
||||
@ -1116,10 +1111,8 @@ int USENTENCEG_Pick( int isentenceg, char *szfound )
|
||||
USENTENCEG_InitLRU( plru, count );
|
||||
else
|
||||
{
|
||||
strcpy( szfound, "!" );
|
||||
strcat( szfound, szgroupname );
|
||||
sprintf( sznum, "%d", ipick );
|
||||
strcat( szfound, sznum );
|
||||
sprintf( szfound, "!%s%d", szgroupname, ipick );
|
||||
|
||||
return ipick;
|
||||
}
|
||||
}
|
||||
@ -1227,7 +1220,6 @@ int SENTENCEG_PlaySequentialSz( edict_t *entity, const char *szgroupname, float
|
||||
void SENTENCEG_Stop( edict_t *entity, int isentenceg, int ipick )
|
||||
{
|
||||
char buffer[64];
|
||||
char sznum[8];
|
||||
|
||||
if( !fSentencesInit )
|
||||
return;
|
||||
@ -1235,10 +1227,7 @@ void SENTENCEG_Stop( edict_t *entity, int isentenceg, int ipick )
|
||||
if( isentenceg < 0 || ipick < 0 )
|
||||
return;
|
||||
|
||||
strcpy( buffer, "!" );
|
||||
strcat( buffer, rgsentenceg[isentenceg].szgroupname );
|
||||
sprintf( sznum, "%d", ipick );
|
||||
strcat( buffer, sznum );
|
||||
sprintf( buffer, "!%s%d", rgsentenceg[isentenceg].szgroupname, ipick );
|
||||
|
||||
STOP_SOUND( entity, CHAN_VOICE, buffer );
|
||||
}
|
||||
@ -1369,9 +1358,8 @@ void SENTENCEG_Init()
|
||||
|
||||
int SENTENCEG_Lookup( const char *sample, char *sentencenum )
|
||||
{
|
||||
char sznum[8];
|
||||
|
||||
int i;
|
||||
|
||||
// this is a sentence name; lookup sentence number
|
||||
// and give to engine as string.
|
||||
for( i = 0; i < gcallsentences; i++ )
|
||||
@ -1379,9 +1367,7 @@ int SENTENCEG_Lookup( const char *sample, char *sentencenum )
|
||||
{
|
||||
if( sentencenum )
|
||||
{
|
||||
strcpy( sentencenum, "!" );
|
||||
sprintf( sznum, "%d", i );
|
||||
strcat( sentencenum, sznum );
|
||||
sprintf(sentencenum, "!%d", i);
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
@ -510,7 +510,7 @@ void CSqueak::PrimaryAttack()
|
||||
#else
|
||||
flags = 0;
|
||||
#endif
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usSnarkFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 0, 0, 0, 0 );
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usSnarkFire, 0.0, g_vecZero, g_vecZero, 0.0, 0.0, 0, 0, 0, 0 );
|
||||
|
||||
if( tr.fAllSolid == 0 && tr.fStartSolid == 0 && tr.flFraction > 0.25 )
|
||||
{
|
||||
|
@ -407,6 +407,13 @@ void CBaseToggle::LinearMove( Vector vecDest, float flSpeed )
|
||||
// divide vector length by speed to get time to reach dest
|
||||
float flTravelTime = vecDestDelta.Length() / flSpeed;
|
||||
|
||||
if( flTravelTime < 0.05 )
|
||||
{
|
||||
UTIL_SetOrigin( pev, m_vecFinalDest );
|
||||
LinearMoveDone();
|
||||
return;
|
||||
}
|
||||
|
||||
// set nextthink to trigger a call to LinearMoveDone when dest is reached
|
||||
pev->nextthink = pev->ltime + flTravelTime;
|
||||
SetThink( &CBaseToggle::LinearMoveDone );
|
||||
|
@ -444,7 +444,7 @@ void CTripmine::PrimaryAttack( void )
|
||||
#else
|
||||
flags = 0;
|
||||
#endif
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usTripFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 0, 0, 0, 0 );
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usTripFire, 0.0, g_vecZero, g_vecZero, 0.0, 0.0, 0, 0, 0, 0 );
|
||||
|
||||
if( tr.flFraction < 1.0 )
|
||||
{
|
||||
|
@ -1733,8 +1733,8 @@ void CSaveRestoreBuffer::BufferRewind( int size )
|
||||
extern "C" {
|
||||
unsigned _rotr( unsigned val, int shift )
|
||||
{
|
||||
register unsigned lobit; /* non-zero means lo bit set */
|
||||
register unsigned num = val; /* number to rotate */
|
||||
unsigned lobit; /* non-zero means lo bit set */
|
||||
unsigned num = val; /* number to rotate */
|
||||
|
||||
shift &= 0x1f; /* modulo 32 -- this will also make
|
||||
negative shifts work */
|
||||
|
@ -552,8 +552,8 @@ void EMIT_GROUPNAME_SUIT(edict_t *entity, const char *groupname);
|
||||
|
||||
#define RANDOM_SOUND_ARRAY( array ) (array) [ RANDOM_LONG(0,ARRAYSIZE( (array) )-1) ]
|
||||
|
||||
#define PLAYBACK_EVENT( flags, who, index ) PLAYBACK_EVENT_FULL( flags, who, index, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 0, 0, 0, 0 );
|
||||
#define PLAYBACK_EVENT_DELAY( flags, who, index, delay ) PLAYBACK_EVENT_FULL( flags, who, index, delay, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 0, 0, 0, 0 );
|
||||
#define PLAYBACK_EVENT( flags, who, index ) PLAYBACK_EVENT_FULL( flags, who, index, 0, g_vecZero, g_vecZero, 0.0, 0.0, 0, 0, 0, 0 );
|
||||
#define PLAYBACK_EVENT_DELAY( flags, who, index, delay ) PLAYBACK_EVENT_FULL( flags, who, index, delay, g_vecZero, g_vecZero, 0.0, 0.0, 0, 0, 0, 0 );
|
||||
|
||||
#define GROUP_OP_AND 0
|
||||
#define GROUP_OP_NAND 1
|
||||
|
@ -1622,7 +1622,7 @@ IMPLEMENT_SAVERESTORE( CEgon, CBasePlayerWeapon )
|
||||
|
||||
TYPEDESCRIPTION CHgun::m_SaveData[] =
|
||||
{
|
||||
DEFINE_FIELD( CHgun, m_flRechargeTime, FIELD_FLOAT ),
|
||||
DEFINE_FIELD( CHgun, m_flRechargeTime, FIELD_TIME ),
|
||||
};
|
||||
|
||||
IMPLEMENT_SAVERESTORE( CHgun, CBasePlayerWeapon )
|
||||
|
72
dlls/wscript
Normal file
72
dlls/wscript
Normal file
@ -0,0 +1,72 @@
|
||||
#! /usr/bin/env python
|
||||
# encoding: utf-8
|
||||
# a1batross, mittorn, 2018
|
||||
|
||||
from waflib import Utils
|
||||
import os
|
||||
|
||||
def options(opt):
|
||||
# stub
|
||||
return
|
||||
|
||||
def configure(conf):
|
||||
# stub
|
||||
return
|
||||
|
||||
def build(bld):
|
||||
defines = []
|
||||
source = bld.path.parent.ant_glob([
|
||||
'pm_shared/*.c',
|
||||
])
|
||||
|
||||
source += [
|
||||
'agrunt.cpp', 'airtank.cpp', 'aflock.cpp', 'animating.cpp', 'animation.cpp', 'apache.cpp',
|
||||
'barnacle.cpp', 'barney.cpp', 'bigmomma.cpp', 'bloater.cpp', 'bmodels.cpp', 'bullsquid.cpp', 'buttons.cpp',
|
||||
'cbase.cpp', 'client.cpp', 'combat.cpp', 'controller.cpp', 'crossbow.cpp', 'crowbar.cpp',
|
||||
'defaultai.cpp', 'doors.cpp',
|
||||
'effects.cpp', 'egon.cpp', 'explode.cpp',
|
||||
'flyingmonster.cpp', 'func_break.cpp', 'func_tank.cpp',
|
||||
'game.cpp', 'gamerules.cpp', 'gargantua.cpp', 'gauss.cpp', 'genericmonster.cpp', 'ggrenade.cpp', 'globals.cpp', 'glock.cpp', 'gman.cpp',
|
||||
'h_ai.cpp', 'h_battery.cpp', 'h_cine.cpp', 'h_cycler.cpp', 'h_export.cpp', 'handgrenade.cpp', 'hassassin.cpp', 'headcrab.cpp',
|
||||
'healthkit.cpp', 'hgrunt.cpp', 'hornet.cpp', 'hornetgun.cpp', 'houndeye.cpp',
|
||||
'ichthyosaur.cpp', 'islave.cpp', 'items.cpp',
|
||||
'leech.cpp', 'lights.cpp',
|
||||
'maprules.cpp', 'monstermaker.cpp', 'monsters.cpp', 'monsterstate.cpp', 'mortar.cpp', 'mp5.cpp', 'multiplay_gamerules.cpp',
|
||||
'nihilanth.cpp', 'nodes.cpp',
|
||||
'observer.cpp', 'osprey.cpp',
|
||||
'pathcorner.cpp', 'plane.cpp', 'plats.cpp', 'player.cpp', 'playermonster.cpp', 'python.cpp',
|
||||
'rat.cpp', 'roach.cpp', 'rpg.cpp',
|
||||
'satchel.cpp', 'schedule.cpp', 'scientist.cpp', 'scripted.cpp', 'shotgun.cpp', 'singleplay_gamerules.cpp', 'skill.cpp',
|
||||
'sound.cpp', 'soundent.cpp', 'spectator.cpp', 'squadmonster.cpp', 'squeakgrenade.cpp', 'subs.cpp',
|
||||
'talkmonster.cpp', 'teamplay_gamerules.cpp', 'tempmonster.cpp', 'tentacle.cpp',
|
||||
'triggers.cpp', 'tripmine.cpp', 'turret.cpp',
|
||||
'util.cpp',
|
||||
'weapons.cpp', 'world.cpp', 'xen.cpp', 'zombie.cpp']
|
||||
|
||||
if bld.env.VOICEMGR:
|
||||
source += bld.path.parent.ant_glob([
|
||||
'game_shared/voice_gamemgr.cpp',
|
||||
])
|
||||
else:
|
||||
defines += ['NO_VOICEGAMEMGR']
|
||||
|
||||
includes = Utils.to_list('. wpn_shared ../common ../engine ../pm_shared ../game_shared ../public')
|
||||
|
||||
libs = []
|
||||
|
||||
if bld.env.DEST_OS2 not in ['android']:
|
||||
install_path = os.path.join(bld.env.GAMEDIR, bld.env.SERVER_DIR)
|
||||
else:
|
||||
install_path = bld.env.PREFIX
|
||||
|
||||
bld.shlib(
|
||||
source = source,
|
||||
target = 'server',
|
||||
features = 'c cxx',
|
||||
includes = includes,
|
||||
defines = defines,
|
||||
use = libs,
|
||||
install_path = install_path,
|
||||
subsystem = bld.env.MSVC_SUBSYSTEM,
|
||||
idx = 2
|
||||
)
|
@ -169,7 +169,7 @@ typedef struct cl_enginefuncs_s
|
||||
int (*GetWindowCenterX)( void );
|
||||
int (*GetWindowCenterY)( void );
|
||||
void (*GetViewAngles)( float * );
|
||||
void (*SetViewAngles)( float * );
|
||||
void (*SetViewAngles)( const float * );
|
||||
int (*GetMaxClients)( void );
|
||||
void (*Cvar_SetValue)( const char *cvar, float value );
|
||||
|
||||
@ -195,20 +195,20 @@ typedef struct cl_enginefuncs_s
|
||||
|
||||
float (*GetClientTime)( void );
|
||||
void (*V_CalcShake)( void );
|
||||
void (*V_ApplyShake)( float *origin, float *angles, float factor );
|
||||
void (*V_ApplyShake)( const float *origin, const float *angles, float factor );
|
||||
|
||||
int (*PM_PointContents)( float *point, int *truecontents );
|
||||
int (*PM_WaterEntity)( float *p );
|
||||
struct pmtrace_s *(*PM_TraceLine)( float *start, float *end, int flags, int usehull, int ignore_pe );
|
||||
int (*PM_PointContents)( const float *point, int *truecontents );
|
||||
int (*PM_WaterEntity)( const float *p );
|
||||
struct pmtrace_s *(*PM_TraceLine)( const float *start, const float *end, int flags, int usehull, int ignore_pe );
|
||||
|
||||
struct model_s *(*CL_LoadModel)( const char *modelname, int *index );
|
||||
int (*CL_CreateVisibleEntity)( int type, struct cl_entity_s *ent );
|
||||
|
||||
const struct model_s* (*GetSpritePointer)( HSPRITE hSprite );
|
||||
void (*pfnPlaySoundByNameAtLocation)( const char *szSound, float volume, float *origin );
|
||||
void (*pfnPlaySoundByNameAtLocation)( const char *szSound, float volume, const float *origin );
|
||||
|
||||
unsigned short (*pfnPrecacheEvent)( int type, const char* psz );
|
||||
void (*pfnPlaybackEvent)( int flags, const struct edict_s *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 );
|
||||
void (*pfnPlaybackEvent)( int flags, const struct edict_s *pInvoker, unsigned short eventindex, float delay, const float *origin, const float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 );
|
||||
void (*pfnWeaponAnim)( int iAnim, int body );
|
||||
float (*pfnRandomFloat)( float flLow, float flHigh );
|
||||
int (*pfnRandomLong)( int lLow, int lHigh );
|
||||
|
@ -124,7 +124,7 @@ typedef struct enginefuncs_s
|
||||
int (*pfnWalkMove)( edict_t *ent, float yaw, float dist, int iMode );
|
||||
void (*pfnSetOrigin)( edict_t *e, const float *rgflOrigin );
|
||||
void (*pfnEmitSound)( edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch );
|
||||
void (*pfnEmitAmbientSound)( edict_t *entity, float *pos, const char *samp, float vol, float attenuation, int fFlags, int pitch );
|
||||
void (*pfnEmitAmbientSound)( edict_t *entity, const float *pos, const char *samp, float vol, float attenuation, int fFlags, int pitch );
|
||||
void (*pfnTraceLine)( const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr );
|
||||
void (*pfnTraceToss)( edict_t* pent, edict_t* pentToIgnore, TraceResult *ptr );
|
||||
int (*pfnTraceMonsterHull)( edict_t *pEdict, const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr );
|
||||
@ -219,10 +219,10 @@ typedef struct enginefuncs_s
|
||||
void (*pfnSetPhysicsKeyValue)( const edict_t *pClient, const char *key, const char *value );
|
||||
const char *(*pfnGetPhysicsInfoString)( const edict_t *pClient );
|
||||
unsigned short (*pfnPrecacheEvent)( int type, const char*psz );
|
||||
void (*pfnPlaybackEvent)( int flags, const edict_t *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 );
|
||||
|
||||
unsigned char *(*pfnSetFatPVS)( float *org );
|
||||
unsigned char *(*pfnSetFatPAS)( float *org );
|
||||
void (*pfnPlaybackEvent)( int flags, const edict_t *pInvoker, unsigned short eventindex, float delay, const float *origin, const float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 );
|
||||
|
||||
unsigned char *(*pfnSetFatPVS)( const float *org );
|
||||
unsigned char *(*pfnSetFatPAS)( const float *org );
|
||||
|
||||
int (*pfnCheckVisibility )( const edict_t *entity, unsigned char *pset );
|
||||
|
||||
@ -241,7 +241,7 @@ typedef struct enginefuncs_s
|
||||
// Forces the client and server to be running with the same version of the specified file
|
||||
// ( e.g., a player model ).
|
||||
// Calling this has no effect in single player
|
||||
void (*pfnForceUnmodified)( FORCE_TYPE type, float *mins, float *maxs, const char *filename );
|
||||
void (*pfnForceUnmodified)( FORCE_TYPE type, const float *mins, const float *maxs, const char *filename );
|
||||
|
||||
void (*pfnGetPlayerStats)( const edict_t *pClient, int *ping, int *packet_loss );
|
||||
|
||||
@ -355,7 +355,7 @@ typedef enum _fieldtypes
|
||||
FIELD_TYPECOUNT // MUST BE LAST
|
||||
} FIELDTYPE;
|
||||
|
||||
#if !defined(offsetof) && !defined(GNUC)
|
||||
#if !defined(offsetof) && !defined(__GNUC__)
|
||||
#define offsetof(s,m) (size_t)&(((s *)0)->m)
|
||||
#endif
|
||||
|
||||
|
621
gnu.txt
621
gnu.txt
@ -1,621 +0,0 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
302
scripts/waifulib/xcompile.py
Normal file
302
scripts/waifulib/xcompile.py
Normal file
@ -0,0 +1,302 @@
|
||||
# encoding: utf-8
|
||||
# xcompile.py -- crosscompiling utils
|
||||
# Copyright (C) 2018 a1batross
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
try: from fwgslib import get_flags_by_compiler
|
||||
except: from waflib.extras.fwgslib import get_flags_by_compiler
|
||||
from waflib import Logs
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Output:
|
||||
# CROSSCOMPILING -- set to true, if crosscompiling is enabled
|
||||
# DEST_OS2 -- as some operating systems is built on top of another, it's better to not change DEST_OS,
|
||||
# instead of this DEST_OS2 is defined with target value
|
||||
# For example: android is built on top of linux and have many things in common,
|
||||
# but it can't be considered as default GNU/Linux.
|
||||
# Possible values:
|
||||
# DEST_OS2 DEST_OS
|
||||
# 'android' 'linux'
|
||||
|
||||
# This class does support ONLY r10e and r19c NDK
|
||||
class Android:
|
||||
ctx = None # waf context
|
||||
arch = None
|
||||
toolchain = None
|
||||
api = None
|
||||
toolchain_path = None
|
||||
ndk_home = None
|
||||
ndk_rev = 0
|
||||
is_hardfloat = False
|
||||
clang = False
|
||||
|
||||
def __init__(self, ctx, arch, toolchain, api):
|
||||
self.ctx = ctx
|
||||
for i in ['ANDROID_NDK_HOME', 'ANDROID_NDK']:
|
||||
self.ndk_home = os.getenv(i)
|
||||
if self.ndk_home != None:
|
||||
break
|
||||
|
||||
if not self.ndk_home:
|
||||
conf.fatal('Set ANDROID_NDK_HOME environment variable pointing to the root of Android NDK!')
|
||||
|
||||
# TODO: this were added at some point of NDK development
|
||||
# but I don't know at which version
|
||||
# r10e don't have it
|
||||
source_prop = os.path.join(self.ndk_home, 'source.properties')
|
||||
if os.path.exists(source_prop):
|
||||
with open(source_prop) as ndk_props_file:
|
||||
for line in ndk_props_file.readlines():
|
||||
tokens = line.split('=')
|
||||
trimed_tokens = [token.strip() for token in tokens]
|
||||
|
||||
if 'Pkg.Revision' in trimed_tokens:
|
||||
self.ndk_rev = int(trimed_tokens[1].split('.')[0])
|
||||
else:
|
||||
self.ndk_rev = 10
|
||||
|
||||
if self.ndk_rev not in [10, 19]:
|
||||
ctx.fatal('Unknown NDK revision: {}'.format(self.ndk_rev))
|
||||
|
||||
self.arch = arch
|
||||
if self.arch == 'armeabi-v7a-hard':
|
||||
if self.ndk_rev <= 10:
|
||||
self.arch = 'armeabi-v7a' # Only armeabi-v7a have hard float ABI
|
||||
self.is_hardfloat = True
|
||||
else:
|
||||
raise Exception('NDK does not support hardfloat ABI')
|
||||
|
||||
self.toolchain = toolchain
|
||||
|
||||
if self.ndk_rev >= 19 or 'clang' in self.toolchain:
|
||||
self.clang = True
|
||||
|
||||
if self.is_arm64() or self.is_amd64() and self.api < 21:
|
||||
Logs.warn('API level for 64-bit target automatically was set to 21')
|
||||
self.api = 21
|
||||
elif self.ndk_rev >= 19 and self.api < 16:
|
||||
Logs.warn('API level automatically was set to 16 due to NDK support')
|
||||
self.api = 16
|
||||
else: self.api = api
|
||||
self.toolchain_path = self.gen_toolchain_path()
|
||||
|
||||
# TODO: Crystax support?
|
||||
# TODO: Support for everything else than linux-x86_64?
|
||||
# TODO: Determine if I actually need to implement listed above
|
||||
|
||||
def is_arm(self):
|
||||
'''
|
||||
Checks if selected architecture is **32-bit** ARM
|
||||
'''
|
||||
return self.arch.startswith('armeabi')
|
||||
|
||||
def is_x86(self):
|
||||
'''
|
||||
Checks if selected architecture is **32-bit** or **64-bit** x86
|
||||
'''
|
||||
return self.arch == 'x86'
|
||||
|
||||
def is_amd64(self):
|
||||
'''
|
||||
Checks if selected architecture is **64-bit** x86
|
||||
'''
|
||||
return self.arch == 'x86_64'
|
||||
|
||||
def is_arm64(self):
|
||||
'''
|
||||
Checks if selected architecture is AArch64
|
||||
'''
|
||||
return self.arch == 'aarch64'
|
||||
|
||||
def is_clang(self):
|
||||
'''
|
||||
Checks if selected toolchain is Clang (TODO)
|
||||
'''
|
||||
return self.clang
|
||||
|
||||
def is_hardfp(self):
|
||||
return self.is_hardfloat
|
||||
|
||||
def gen_toolchain_path(self):
|
||||
path = 'toolchains'
|
||||
|
||||
if sys.platform.startswith('linux'):
|
||||
toolchain_host = 'linux'
|
||||
elif sys.platform.startswith('darwin'):
|
||||
toolchain_host = 'darwin'
|
||||
elif sys.platform.startswith('win32') or sys.platform.startswith('cygwin'):
|
||||
toolchain_host = 'windows'
|
||||
else: raise Exception('Unsupported by NDK host platform')
|
||||
|
||||
toolchain_host += '-'
|
||||
|
||||
# Assuming we are building on x86
|
||||
if sys.maxsize > 2**32:
|
||||
toolchain_host += 'x86_64'
|
||||
else: toolchain_host += 'x86'
|
||||
|
||||
if self.is_clang():
|
||||
if self.ndk_rev < 19:
|
||||
raise Exception('Clang is not supported for this NDK')
|
||||
|
||||
toolchain_folder = 'llvm'
|
||||
|
||||
if self.is_x86():
|
||||
triplet = 'i686-linux-android{}-'.format(self.api)
|
||||
elif self.is_arm():
|
||||
triplet = 'armv7a-linux-androideabi{}-'.format(self.api)
|
||||
else:
|
||||
triplet = self.arch + '-linux-android{}-'.format(self.api)
|
||||
else:
|
||||
if self.is_x86() or self.is_amd64():
|
||||
toolchain_folder = self.arch + '-' + self.toolchain
|
||||
elif self.is_arm():
|
||||
toolchain_folder = 'arm-linux-androideabi-' + self.toolchain
|
||||
else:
|
||||
toolchain_folder = self.arch + '-linux-android-' + self.toolchain
|
||||
|
||||
if self.is_x86():
|
||||
triplet = 'i686-linux-android-'
|
||||
elif self.is_arm():
|
||||
triplet = 'arm-linux-androideabi-'
|
||||
else:
|
||||
triplet = self.arch + '-linux-android-'
|
||||
|
||||
return os.path.join(path, toolchain_folder, 'prebuilt', toolchain_host, 'bin', triplet)
|
||||
|
||||
def cc(self):
|
||||
return os.path.abspath(os.path.join(self.ndk_home, self.toolchain_path + ('clang' if self.is_clang() else 'gcc')))
|
||||
|
||||
def cxx(self):
|
||||
return os.path.abspath(os.path.join(self.ndk_home, self.toolchain_path + ('clang++' if self.is_clang() else 'g++')))
|
||||
|
||||
def system_stl(self):
|
||||
# TODO: proper STL support
|
||||
return os.path.abspath(os.path.join(self.ndk_home, 'sources', 'cxx-stl', 'system', 'include'))
|
||||
|
||||
def sysroot(self):
|
||||
if self.ndk_rev >= 19:
|
||||
return os.path.abspath(os.path.join(self.ndk_home, 'sysroot'))
|
||||
else:
|
||||
arch = self.arch
|
||||
if self.is_arm():
|
||||
arch = 'arm'
|
||||
elif self.is_arm64():
|
||||
arch = 'arm64'
|
||||
path = 'platforms/android-{}/arch-{}'.format(self.api, arch)
|
||||
|
||||
return os.path.abspath(os.path.join(self.ndk_home, path))
|
||||
|
||||
def cflags(self):
|
||||
cflags = ['--sysroot={0}'.format(self.sysroot()), '-DANDROID', '-D__ANDROID__']
|
||||
cflags += ['-I{0}'.format(self.system_stl())]
|
||||
if self.is_arm():
|
||||
if self.arch == 'armeabi-v7a':
|
||||
# ARMv7 support
|
||||
cflags += ['-mthumb', '-mfpu=neon', '-mcpu=cortex-a9', '-DHAVE_EFFICIENT_UNALIGNED_ACCESS', '-DVECTORIZE_SINCOS']
|
||||
if not self.is_clang():
|
||||
cflags += [ '-mvectorize-with-neon-quad' ]
|
||||
if self.is_hardfloat:
|
||||
cflags += ['-D_NDK_MATH_NO_SOFTFP=1', '-mhard-float', '-mfloat-abi=hard', '-DLOAD_HARDFP', '-DSOFTFP_LINK']
|
||||
else:
|
||||
cflags += ['-mfloat-abi=softfp']
|
||||
else:
|
||||
# ARMv5 support
|
||||
cflags += ['-march=armv5te', '-mtune=xscale', '-msoft-float']
|
||||
elif self.is_x86():
|
||||
cflags += ['-mtune=atom', '-march=atom', '-mssse3', '-mfpmath=sse', '-DVECTORIZE_SINCOS', '-DHAVE_EFFICIENT_UNALIGNED_ACCESS']
|
||||
return cflags
|
||||
|
||||
# they go before object list
|
||||
def linkflags(self):
|
||||
linkflags = ['--sysroot={0}'.format(self.sysroot())]
|
||||
return linkflags
|
||||
|
||||
def ldflags(self):
|
||||
ldflags = ['-lgcc', '-no-canonical-prefixes']
|
||||
if self.is_arm():
|
||||
if self.arch == 'armeabi-v7a':
|
||||
ldflags += ['-march=armv7-a', '-Wl,--fix-cortex-a8', '-mthumb']
|
||||
if self.is_hardfloat:
|
||||
ldflags += ['-Wl,--no-warn-mismatch', '-lm_hard']
|
||||
else:
|
||||
ldflags += ['-march=armv5te']
|
||||
return ldflags
|
||||
|
||||
def options(opt):
|
||||
android = opt.add_option_group('Android options')
|
||||
android.add_option('--android', action='store', dest='ANDROID_OPTS', default=None,
|
||||
help='enable building for android, format: --android=<arch>,<toolchain>,<api>, example: --android=armeabi-v7a-hard,4.9,9')
|
||||
|
||||
def configure(conf):
|
||||
if conf.options.ANDROID_OPTS:
|
||||
values = conf.options.ANDROID_OPTS.split(',')
|
||||
if len(values) != 3:
|
||||
conf.fatal('Invalid --android paramater value!')
|
||||
|
||||
valid_archs = ['x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'armeabi-v7a-hard', 'aarch64', 'mipsel', 'mips64el']
|
||||
|
||||
if values[0] not in valid_archs:
|
||||
conf.fatal('Unknown arch: {}. Supported: {}'.format(values[0], ', '.join(valid_archs)))
|
||||
|
||||
android = Android(conf, values[0], values[1], int(values[2]))
|
||||
setattr(conf, 'android', android)
|
||||
conf.environ['CC'] = android.cc()
|
||||
conf.environ['CXX'] = android.cxx()
|
||||
conf.env.CFLAGS += android.cflags()
|
||||
conf.env.CXXFLAGS += android.cflags()
|
||||
conf.env.LINKFLAGS += android.linkflags()
|
||||
conf.env.LDFLAGS += android.ldflags()
|
||||
|
||||
conf.env.HAVE_M = True
|
||||
if android.is_hardfp():
|
||||
conf.env.LIB_M = ['m_hard']
|
||||
else: conf.env.LIB_M = ['m']
|
||||
|
||||
conf.env.PREFIX = '/lib/{}'.format(android.arch)
|
||||
|
||||
conf.msg('Selected Android NDK', '{}, version: {}'.format(android.ndk_home, android.ndk_rev))
|
||||
# no need to print C/C++ compiler, as it would be printed by compiler_c/cxx
|
||||
conf.msg('... C/C++ flags', ' '.join(android.cflags()).replace(android.ndk_home, '$NDK'))
|
||||
conf.msg('... link flags', ' '.join(android.linkflags()).replace(android.ndk_home, '$NDK'))
|
||||
conf.msg('... ld flags', ' '.join(android.ldflags()).replace(android.ndk_home, '$NDK'))
|
||||
|
||||
# conf.env.ANDROID_OPTS = android
|
||||
conf.env.DEST_OS2 = 'android'
|
||||
# else:
|
||||
# conf.load('compiler_c compiler_cxx') # Use host compiler :)
|
||||
|
||||
def post_compiler_cxx_configure(conf):
|
||||
if conf.options.ANDROID_OPTS:
|
||||
if conf.android.ndk_rev >= 19:
|
||||
conf.env.CXXFLAGS_cxxshlib += ['-static-libstdc++']
|
||||
conf.env.LDFLAGS_cxxshlib += ['-static-libstdc++']
|
||||
return
|
||||
|
||||
def post_compiler_c_configure(conf):
|
||||
return
|
||||
|
||||
from waflib.Tools import compiler_cxx, compiler_c
|
||||
|
||||
compiler_cxx_configure = getattr(compiler_cxx, 'configure')
|
||||
compiler_c_configure = getattr(compiler_c, 'configure')
|
||||
|
||||
def patch_compiler_cxx_configure(conf):
|
||||
compiler_cxx_configure(conf)
|
||||
post_compiler_cxx_configure(conf)
|
||||
|
||||
def patch_compiler_c_configure(conf):
|
||||
compiler_c_configure(conf)
|
||||
post_compiler_c_configure(conf)
|
||||
|
||||
setattr(compiler_cxx, 'configure', patch_compiler_cxx_configure)
|
||||
setattr(compiler_c, 'configure', patch_compiler_c_configure)
|
169
waf
vendored
Executable file
169
waf
vendored
Executable file
File diff suppressed because one or more lines are too long
101
waf.bat
Normal file
101
waf.bat
Normal file
@ -0,0 +1,101 @@
|
||||
@echo off
|
||||
|
||||
rem try fix py2 build
|
||||
chcp 1252
|
||||
set PYTHONIOENCODING=UTF-8
|
||||
rem from issue #964
|
||||
|
||||
Setlocal EnableDelayedExpansion
|
||||
|
||||
rem Check Windows Version
|
||||
set TOKEN=tokens=3*
|
||||
ver | findstr /i "5\.0\." > nul
|
||||
if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=3*
|
||||
ver | findstr /i "5\.1\." > nul
|
||||
if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=3*
|
||||
ver | findstr /i "5\.2\." > nul
|
||||
if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=3*
|
||||
ver | findstr /i "6\.0\." > nul
|
||||
if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=2*
|
||||
ver | findstr /i "6\.1\." > nul
|
||||
if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=2*
|
||||
|
||||
rem Start calculating PYTHON and PYTHON_DIR
|
||||
set PYTHON=
|
||||
set PYTHON_DIR=
|
||||
|
||||
Setlocal EnableDelayedExpansion
|
||||
|
||||
set PYTHON_DIR_OK=FALSE
|
||||
set REGPATH=
|
||||
|
||||
for %%i in (3.9 3.8 3.7 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.7 2.6 2.5) do (
|
||||
for %%j in (HKCU HKLM) do (
|
||||
for %%k in (SOFTWARE\Wow6432Node SOFTWARE) do (
|
||||
for %%l in (Python\PythonCore IronPython) do (
|
||||
set REG_PYTHON_EXE=python.exe
|
||||
if "%%l"=="IronPython" (
|
||||
set REG_PYTHON_EXE=ipy.exe
|
||||
)
|
||||
|
||||
@echo on
|
||||
|
||||
set REGPATH=%%j\%%k\%%l\%%i\InstallPath
|
||||
rem @echo Regpath !REGPATH!
|
||||
REG QUERY "!REGPATH!" /ve 1>nul 2>nul
|
||||
if !ERRORLEVEL! equ 0 (
|
||||
for /F "%TOKEN% delims= " %%A IN ('REG QUERY "!REGPATH!" /ve') do @set REG_PYTHON_DIR=%%B
|
||||
if exist !REG_PYTHON_DIR! (
|
||||
IF NOT "!REG_PYTHON_DIR:~-1!"=="\" SET REG_PYTHON_DIR=!REG_PYTHON_DIR!\
|
||||
set REG_PYTHON=!REG_PYTHON_DIR!!REG_PYTHON_EXE!
|
||||
rem set PYTHON_DIR_OK=TRUE
|
||||
if "!PYTHON_DIR_OK!"=="FALSE" (
|
||||
set PYTHON_DIR=!REG_PYTHON_DIR!
|
||||
set PYTHON=!REG_PYTHON!
|
||||
set PYTHON_DIR_OK=TRUE
|
||||
)
|
||||
|
||||
rem set PYTHON_DIR_OK=FALSE
|
||||
rem @echo Find !REG_PYTHON!
|
||||
rem goto finished
|
||||
)
|
||||
)
|
||||
|
||||
echo off
|
||||
|
||||
)
|
||||
rem for l
|
||||
)
|
||||
rem for k
|
||||
)
|
||||
rem for j
|
||||
)
|
||||
rem for i
|
||||
|
||||
|
||||
|
||||
:finished
|
||||
|
||||
Endlocal & SET PYTHON_DIR=%PYTHON_DIR% & SET PYTHON=%PYTHON%
|
||||
|
||||
if "%PYTHON_DIR%" == "" (
|
||||
rem @echo No Python dir
|
||||
set PYTHON=python
|
||||
goto running
|
||||
)
|
||||
|
||||
rem @echo %PYTHON_DIR%
|
||||
|
||||
if "%PYTHON%" == "" (
|
||||
rem @echo No Python
|
||||
set PYTHON=python
|
||||
goto running
|
||||
)
|
||||
|
||||
:running
|
||||
|
||||
@echo Using %PYTHON%
|
||||
|
||||
"%PYTHON%" -x "%~dp0waf" %*
|
||||
Endlocal
|
||||
exit /b %ERRORLEVEL%
|
160
wscript
Normal file
160
wscript
Normal file
@ -0,0 +1,160 @@
|
||||
#! /usr/bin/env python
|
||||
# encoding: utf-8
|
||||
# a1batross, mittorn, 2018
|
||||
|
||||
from __future__ import print_function
|
||||
from waflib import Logs
|
||||
import sys
|
||||
import os
|
||||
sys.path.append(os.path.realpath('scripts/waflib'))
|
||||
|
||||
VERSION = '2.4'
|
||||
APPNAME = 'hlsdk-xash3d'
|
||||
top = '.'
|
||||
|
||||
def options(opt):
|
||||
grp = opt.add_option_group('Common options')
|
||||
|
||||
grp.add_option('-T', '--build-type', action='store', dest='BUILD_TYPE', default = None,
|
||||
help = 'build type: debug, release or none(custom flags)')
|
||||
|
||||
grp.add_option('-8', '--64bits', action = 'store_true', dest = 'ALLOW64', default = False,
|
||||
help = 'allow targetting 64-bit game dlls')
|
||||
|
||||
grp.add_option('--enable-voicemgr', action = 'store_true', dest = 'VOICEMGR', default = False,
|
||||
help = 'enable voice manager')
|
||||
|
||||
grp.add_option('--enable-goldsrc-support', action = 'store_true', dest = 'GOLDSRC', default = False,
|
||||
help = 'enable GoldSource engine support')
|
||||
|
||||
opt.recurse('cl_dll dlls')
|
||||
|
||||
opt.load('xcompile compiler_cxx compiler_c')
|
||||
if sys.platform == 'win32':
|
||||
opt.load('msvc msdev')
|
||||
opt.load('reconfigure')
|
||||
|
||||
|
||||
def configure(conf):
|
||||
# Configuration
|
||||
conf.env.GAMEDIR = 'valve'
|
||||
conf.env.CLIENT_DIR = 'cl_dlls'
|
||||
conf.env.SERVER_DIR = 'dlls'
|
||||
conf.env.SERVER_NAME = 'hl'
|
||||
conf.env.PREFIX = ''
|
||||
|
||||
conf.load('reconfigure')
|
||||
|
||||
conf.start_msg('Build type')
|
||||
if conf.options.BUILD_TYPE == None:
|
||||
conf.end_msg('not set', color='RED')
|
||||
conf.fatal('Please set a build type, for example "-T release"')
|
||||
elif not conf.options.BUILD_TYPE in ['fast', 'release', 'debug', 'nooptimize', 'sanitize', 'none']:
|
||||
conf.end_msg(conf.options.BUILD_TYPE, color='RED')
|
||||
conf.fatal('Invalid build type. Valid are "debug", "release" or "none"')
|
||||
conf.end_msg(conf.options.BUILD_TYPE)
|
||||
|
||||
# -march=native should not be used
|
||||
if conf.options.BUILD_TYPE == 'fast':
|
||||
Logs.warn('WARNING: \'fast\' build type should not be used in release builds')
|
||||
|
||||
conf.env.VOICEMGR = conf.options.VOICEMGR
|
||||
conf.env.GOLDSRC = conf.options.GOLDSRC
|
||||
|
||||
# Force XP compability, all build targets should add
|
||||
# subsystem=bld.env.MSVC_SUBSYSTEM
|
||||
# TODO: wrapper around bld.stlib, bld.shlib and so on?
|
||||
conf.env.MSVC_SUBSYSTEM = 'WINDOWS,5.01'
|
||||
conf.env.MSVC_TARGETS = ['x86'] # explicitly request x86 target for MSVC
|
||||
if sys.platform == 'win32':
|
||||
conf.load('msvc msdev')
|
||||
conf.load('xcompile compiler_c compiler_cxx')
|
||||
|
||||
if conf.env.DEST_OS2 == 'android':
|
||||
conf.options.ALLOW64 = True
|
||||
conf.options.GOLDSRC = False
|
||||
conf.env.SERVER_NAME = 'server' # can't be any other name, until specified
|
||||
|
||||
# print(conf.options.ALLOW64)
|
||||
|
||||
conf.env.BIT32_MANDATORY = not conf.options.ALLOW64
|
||||
conf.env.BIT32_ALLOW64 = conf.options.ALLOW64
|
||||
conf.load('force_32bit')
|
||||
|
||||
if conf.env.DEST_SIZEOF_VOID_P == 4:
|
||||
Logs.info('NOTE: will build game dlls for 32-bit target')
|
||||
else:
|
||||
Logs.warn('WARNING: 64-bit game dlls may be unstable')
|
||||
|
||||
linker_flags = {
|
||||
'common': {
|
||||
'msvc': ['/DEBUG'], # always create PDB, doesn't affect result binaries
|
||||
'gcc': ['-Wl,--no-undefined']
|
||||
},
|
||||
'sanitize': {
|
||||
'gcc': ['-fsanitize=undefined', '-fsanitize=address'],
|
||||
}
|
||||
}
|
||||
|
||||
compiler_c_cxx_flags = {
|
||||
'common': {
|
||||
'msvc': ['/D_USING_V110_SDK71_', '/Zi', '/FS'],
|
||||
'clang': ['-g', '-gdwarf-2'],
|
||||
'gcc': ['-g', '-Werror=implicit-function-declaration', '-fdiagnostics-color=always']
|
||||
},
|
||||
'fast': {
|
||||
'msvc': ['/O2', '/Oy'], #todo: check /GL /LTCG
|
||||
'gcc': ['-Ofast', '-march=native', '-funsafe-math-optimizations', '-funsafe-loop-optimizations', '-fomit-frame-pointer'],
|
||||
'default': ['-O3']
|
||||
},
|
||||
'release': {
|
||||
'msvc': ['/O2'],
|
||||
'default': ['-O3']
|
||||
},
|
||||
'debug': {
|
||||
'msvc': ['/O1'],
|
||||
'gcc': ['-Og'],
|
||||
'default': ['-O1']
|
||||
},
|
||||
'sanitize': {
|
||||
'msvc': ['/Od', '/RTC1'],
|
||||
'gcc': ['-Og', '-fsanitize=undefined', '-fsanitize=address'],
|
||||
'default': ['-O1']
|
||||
},
|
||||
'nooptimize': {
|
||||
'msvc': ['/Od'],
|
||||
'default': ['-O0']
|
||||
}
|
||||
}
|
||||
|
||||
conf.env.append_unique('CFLAGS', conf.get_flags_by_type(
|
||||
compiler_c_cxx_flags, conf.options.BUILD_TYPE, conf.env.COMPILER_CC))
|
||||
conf.env.append_unique('CXXFLAGS', conf.get_flags_by_type(
|
||||
compiler_c_cxx_flags, conf.options.BUILD_TYPE, conf.env.COMPILER_CC))
|
||||
conf.env.append_unique('LINKFLAGS', conf.get_flags_by_type(
|
||||
linker_flags, conf.options.BUILD_TYPE, conf.env.COMPILER_CC))
|
||||
|
||||
if conf.env.COMPILER_CC == 'msvc':
|
||||
conf.env.append_unique('DEFINES', ['_CRT_SECURE_NO_WARNINGS','_CRT_NONSTDC_NO_DEPRECATE'])
|
||||
else:
|
||||
conf.env.append_unique('DEFINES', ['stricmp=strcasecmp','strnicmp=strncasecmp','_LINUX','LINUX','_snprintf=snprintf','_vsnprintf=vsnprintf'])
|
||||
cflags = ['-fvisibility=hidden','-Wno-write-strings']
|
||||
conf.env.append_unique('CFLAGS', cflags)
|
||||
conf.env.append_unique('CXXFLAGS', cflags + ['-Wno-invalid-offsetof', '-fno-rtti', '-fno-exceptions'])
|
||||
|
||||
# strip lib from pattern
|
||||
if conf.env.DEST_OS in ['linux', 'darwin'] and conf.env.DEST_OS2 not in ['android']:
|
||||
if conf.env.cshlib_PATTERN.startswith('lib'):
|
||||
conf.env.cshlib_PATTERN = conf.env.cshlib_PATTERN[3:]
|
||||
if conf.env.cxxshlib_PATTERN.startswith('lib'):
|
||||
conf.env.cxxshlib_PATTERN = conf.env.cxxshlib_PATTERN[3:]
|
||||
|
||||
conf.env.append_unique('DEFINES', 'CLIENT_WEAPONS')
|
||||
|
||||
conf.recurse('cl_dll dlls')
|
||||
|
||||
def build(bld):
|
||||
bld.recurse('cl_dll dlls')
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user