Add TF sources

This commit is contained in:
DPT.Velaron 2018-12-07 12:41:53 +02:00
parent e0cf84da82
commit cde2afff7c
44 changed files with 5279 additions and 663 deletions

3
.gitignore vendored
View File

@ -1,4 +1,4 @@
# Binaries
.vscode/
*.o
*.so
*/*.o
@ -17,3 +17,4 @@ cmake_install.cmake
*.vsxproj
*.vsproj
*.sln
*.cmd

31
android/.gitignore vendored Normal file
View File

@ -0,0 +1,31 @@
# Built application files
*.apk
*.ap_
# Files for the Dalvik VM
*.dex
# Java class files
*.class
# Generated files
bin/
gen/
# Gradle files
.gradle/
build/
/*/build/
# Native files
obj/
libs/
# Local configuration file (sdk path, etc)
local.properties
# Proguard folder generated by Eclipse
proguard/
# Log Files
*.log

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Set your package name here -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="in.celest.xash3d.tfc15client"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="5" android:targetSdkVersion="8"/>
<!-- Set your application name here -->
<application android:label="TFC15-Client" android:debuggable="true"
android:icon="@drawable/ic_launcher">
<!-- Set your launcher title here -->
<activity android:name="in.celest.xash3d.LauncherActivity"
android:label="TFC15-Client"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- Uncomment this if you have assets -->
<!--<receiver android:name="in.celest.xash3d.InstallReceiver">
<intent-filter android:priority="100">
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_CHANGED" />
<action android:name="android.intent.action.PACKAGE_INSTALL" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<data android:scheme="package" />
</intent-filter>
</receiver>-->
</application>
</manifest>

24
android/HOWTO.txt Normal file
View File

@ -0,0 +1,24 @@
### Android/Java part
* AndroidManifest.xml:
* * Rename manifest package
* * Change appliction label
* * Uncomment icon and InstallReceiver if used
* src/in/celest/xash3d/LauncherActivity.java
* * Set mod gamedir
* * Set mod and launch button title
* * Set library loading options
* * Enable extras.pak extracting
* * Pass envieoment variables
* src/in/celest/xash3d/ExtractAssets.java
* * Add extra files to unpack
### Native part
* Place folders with your mod project to jni/
* You may provide extras.pak for additional files
* You may use client from other package for server mods (read comments in LauncherActivity)
* You may use original server libraries for bots by loading it directly from native part
* Use getenv("XASH3D_GAMELIBDIR") and getenv("XASH3D_ENGLIBDIR") to get mod and half-life libraries path
* You may add options and pass it as enviroment variables (read comments in LauncherActivity)
* Place icon to res/drawable/ic_launcher.png and uncomment lines in AndroidManifest

13
android/build-manual.sh Normal file
View File

@ -0,0 +1,13 @@
ANDROID_JAR=../android-13.jar
AAPT=./../aapt
DX=./../dx
APKBUILDER=./../apkbuilder
NAME=mod
mkdir bin
mkdir bin/classes
$AAPT package -M AndroidManifest.xml -m -S res -I $ANDROID_JAR
$JAVA_HOME/bin/javac -d bin/classes -s bin/classes -cp $ANDROID_JAR src/in/celest/xash3d/LauncherActivity.java
$DX --dex --output=bin/classes.dex bin/classes/
/mnt/app/apktool/aapt package -f -M AndroidManifest.xml -S res -I $ANDROID_JAR -F bin/$NAME.apk.unaligned
$APKBUILDER bin/$NAME.apk -u -nf libs/ -rj libs -f bin/classes.dex -z bin/$NAME.apk.unaligned
java -jar /mnt/app/apktool/signapk.jar /mnt/app/apktool/testkey.x509.pem /mnt/app/apktool/testkey.pk8 bin/$NAME.apk bin/$NAME-signed.apk

6
android/build.sh Normal file
View File

@ -0,0 +1,6 @@
#!/bin/sh
ndk-build NDK_TOOLCHAIN_VERSION=4.8 NDK_DEBUG=1 V=1 -j5 APP_CFLAGS="-w"
ant debug
#jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ../myks.keystore bin/mod-unsigned.apk xashdroid -tsa https://timestamp.geotrust.com/tsa
#zipalign 4 bin/cs16-client-unsigned.apk bin/mod.apk

92
android/build.xml Normal file
View File

@ -0,0 +1,92 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="mod" default="help">
<!-- The local.properties file is created and updated by the 'android' tool.
It contains the path to the SDK. It should *NOT* be checked into
Version Control Systems. -->
<property file="local.properties" />
<!-- The ant.properties file can be created by you. It is only edited by the
'android' tool to add properties to it.
This is the place to change some Ant specific build properties.
Here are some properties you may want to change/update:
source.dir
The name of the source directory. Default is 'src'.
out.dir
The name of the output directory. Default is 'bin'.
For other overridable properties, look at the beginning of the rules
files in the SDK, at tools/ant/build.xml
Properties related to the SDK location or the project target should
be updated using the 'android' tool with the 'update' action.
This file is an integral part of the build system for your
application and should be checked into Version Control Systems.
-->
<property file="ant.properties" />
<!-- if sdk.dir was not set from one of the property file, then
get it from the ANDROID_HOME env var.
This must be done before we load project.properties since
the proguard config can use sdk.dir -->
<property environment="env" />
<condition property="sdk.dir" value="${env.ANDROID_HOME}">
<isset property="env.ANDROID_HOME" />
</condition>
<!-- The project.properties file is created and updated by the 'android'
tool, as well as ADT.
This contains project specific properties such as project target, and library
dependencies. Lower level build properties are stored in ant.properties
(or in .classpath for Eclipse projects).
This file is an integral part of the build system for your
application and should be checked into Version Control Systems. -->
<loadproperties srcFile="project.properties" />
<!-- quick check on sdk.dir -->
<fail
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
unless="sdk.dir"
/>
<!--
Import per project custom build rules if present at the root of the project.
This is the place to put custom intermediary targets such as:
-pre-build
-pre-compile
-post-compile (This is typically used for code obfuscation.
Compiled code location: ${out.classes.absolute.dir}
If this is not done in place, override ${out.dex.input.absolute.dir})
-post-package
-post-build
-pre-clean
-->
<import file="custom_rules.xml" optional="true" />
<!-- Import the actual build file.
To customize existing targets, there are two options:
- Customize only one target:
- copy/paste the target into this file, *before* the
<import> task.
- customize it to your needs.
- Customize the whole content of build.xml
- copy/paste the content of the rules files (minus the top node)
into this file, replacing the <import> task.
- customize to your needs.
***********************
****** IMPORTANT ******
***********************
In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
in order to avoid having your file be overridden by tools such as "android update project"
-->
<!-- version-tag: 1 -->
<import file="${sdk.dir}/tools/ant/build.xml" />
</project>

6
android/jni/Android.mk Normal file
View File

@ -0,0 +1,6 @@
override TARGET_arm_release_CFLAGS :=
override TARGET_thumb_release_CFLAGS :=
override TARGET_arm_debug_CFLAGS :=
override TARGET_thumb_debug_CFLAGS :=
override TARGET_CFLAGS :=
include $(call my-dir)/../../cl_dll/Android.mk

View File

@ -0,0 +1,11 @@
CFLAGS_OPT := -O3 -fomit-frame-pointer -ggdb -funsafe-math-optimizations -ftree-vectorize -fgraphite-identity -floop-interchange -floop-block -funsafe-loop-optimizations -finline-limit=1024
CFLAGS_OPT_ARM := -mthumb -mfpu=neon -mcpu=cortex-a9 -pipe -mvectorize-with-neon-quad -DVECTORIZE_SINCOS
CFLAGS_OPT_ARMv5 :=-march=armv6 -mfpu=vfp -marm -pipe
CFLAGS_OPT_X86 := -mtune=atom -march=atom -mssse3 -mfpmath=sse -funroll-loops -pipe -DVECTORIZE_SINCOS
CFLAGS_HARDFP := -D_NDK_MATH_NO_SOFTFP=1 -mhard-float -mfloat-abi=hard -DLOAD_HARDFP -DSOFTFP_LINK
APPLICATIONMK_PATH = $(call my-dir)
XASH3D_CONFIG := $(APPLICATIONMK_PATH)/mod_config.mk
APP_ABI := x86 armeabi-v7a-hard armeabi
APP_MODULES := client

14
android/jni/mod_config.mk Normal file
View File

@ -0,0 +1,14 @@
LOCAL_CFLAGS += $(CFLAGS_OPT)
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a-hard)
LOCAL_CFLAGS += $(CFLAGS_OPT_ARM) $(CFLAGS_HARDFP)
endif
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_CFLAGS += $(CFLAGS_OPT_ARM) -mfloat-abi=softfp
endif
ifeq ($(TARGET_ARCH_ABI),armeabi)
LOCAL_CFLAGS += $(CFLAGS_OPT_ARMv5)
endif
ifeq ($(TARGET_ARCH_ABI),x86)
LOCAL_CFLAGS += $(CFLAGS_OPT_X86)
endif

View File

@ -0,0 +1,11 @@
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system use,
# "build.properties", and override values to adapt the script to your
# project structure.
# Project target.
target=android-8

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@ -0,0 +1,96 @@
package in.celest.xash3d;
import android.content.SharedPreferences;
import java.io.FileOutputStream;
import java.io.File;
import java.io.InputStream;
import java.lang.reflect.Method;
import android.util.Log;
import android.content.Context;
public class ExtractAssets
{
public static String TAG = "ExtractAssets";
static SharedPreferences mPref;
public static int PAK_VERSION = 0;
private static int chmod(String path, int mode) {
int ret = -1;
try
{
ret = Runtime.getRuntime().exec("chmod " + Integer.toOctalString(mode) + " " + path).waitFor();
Log.d(TAG, "chmod " + Integer.toOctalString(mode) + " " + path + ": " + ret );
}
catch(Exception e)
{
ret = -1;
Log.d(TAG, "chmod: Runtime not worked: " + e.toString() );
}
try
{
Class fileUtils = Class.forName("android.os.FileUtils");
Method setPermissions = fileUtils.getMethod("setPermissions",
String.class, int.class, int.class, int.class);
ret = (Integer) setPermissions.invoke(null, path,
mode, -1, -1);
}
catch(Exception e)
{
ret = -1;
Log.d(TAG, "chmod: FileUtils not worked: " + e.toString() );
}
return ret;
}
private static void extractFile(Context context, String path)
{
try
{
InputStream is = null;
FileOutputStream os = null;
is = context.getAssets().open(path);
File out = new File(context.getFilesDir().getPath()+'/'+path);
out.getParentFile().mkdirs();
chmod( out.getParent(), 0777 );
os = new FileOutputStream(out);
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0)
{
os.write(buffer, 0, length);
}
os.close();
is.close();
chmod( context.getFilesDir().getPath()+'/'+path, 0777 );
}
catch( Exception e )
{
Log.e( TAG, "Failed to extract file:" + e.toString() );
e.printStackTrace();
}
}
public static synchronized void extractPAK(Context context, Boolean force)
{
InputStream is = null;
FileOutputStream os = null;
try
{
if( mPref == null )
mPref = context.getSharedPreferences("mod", 0);
synchronized( mPref )
{
if( mPref.getInt( "pakversion", 0 ) == PAK_VERSION && !force )
return;
extractFile(context, "extras.pak");
// add custom files here
SharedPreferences.Editor editor = mPref.edit();
editor.putInt( "pakversion", PAK_VERSION );
editor.commit();
}
}
catch( Exception e )
{
Log.e( TAG, "Failed to extract PAK:" + e.toString() );
}
}
}

View File

@ -0,0 +1,17 @@
package in.celest.xash3d;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class InstallReceiver extends BroadcastReceiver
{
private static final String TAG = "InstallReceiver";
@Override
public void onReceive( Context context, Intent arg1 )
{
Log.d( TAG, "Install received, extracting PAK" );
ExtractAssets.extractPAK( context, true );
}
}

View File

@ -0,0 +1,229 @@
package in.celest.xash3d;
import android.app.*;
import android.content.*;
import android.graphics.*;
import android.os.*;
import android.text.*;
import android.text.style.*;
import android.view.*;
import android.widget.*;
import android.widget.LinearLayout.*;
public class LauncherActivity extends Activity {
static EditText cmdArgs;
static SharedPreferences mPref;
public static final int sdk = Integer.valueOf(Build.VERSION.SDK);
public SpannableString styleButtonString(String str)
{
if(sdk < 21)
str = str.toUpperCase();
SpannableString spanString = new SpannableString(str.toUpperCase());
if(sdk < 21)
spanString.setSpan(new StyleSpan(Typeface.BOLD), 0, str.length(), 0);
return spanString;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
// set theme
if ( sdk >= 21 )
super.setTheme( 0x01030224 );
else super.setTheme( 0x01030005 );
// Build layout
LinearLayout launcher = new LinearLayout(this);
launcher.setOrientation(LinearLayout.VERTICAL);
launcher.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
launcher.setBackgroundColor(0xFF252525);
TextView launcherTitle = new TextView(this);
LayoutParams titleparams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
titleparams.setMargins(5,20,5,1);
LayoutParams buttonparams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
buttonparams.setMargins(10,20,10,20);
launcherTitle.setLayoutParams(titleparams);
launcherTitle.setText("TFC15-Client");
launcherTitle.setTextAppearance(this, android.R.attr.textAppearanceMedium);
launcherTitle.setTextSize(25);
launcherTitle.setBackgroundColor(0xFF555555);
launcherTitle.setCompoundDrawablePadding(10);
try
{
launcherTitle.setCompoundDrawablesWithIntrinsicBounds(getApplicationContext().getPackageManager().getApplicationIcon(getPackageName()),null,null,null);
launcherTitle.setPadding(6,9,6,0);
}
catch(Exception e)
{
launcherTitle.setPadding(6,6,6,6);
}
launcher.addView(launcherTitle);
LinearLayout launcherBody = new LinearLayout(this);
launcherBody.setOrientation(LinearLayout.VERTICAL);
launcherBody.setLayoutParams(titleparams);
launcherBody.setBackgroundColor(0xFF454545);
LinearLayout launcherBorder = new LinearLayout(this);
launcherBorder.setLayoutParams(titleparams);
launcherBorder.setBackgroundColor(0xFF555555);
launcherBorder.setOrientation(LinearLayout.VERTICAL);
LinearLayout launcherBorder2 = new LinearLayout(this);
launcherBorder2.setLayoutParams(titleparams);
launcherBorder2.setOrientation(LinearLayout.VERTICAL);
launcherBorder2.setBackgroundColor(0xFF353535);
launcherBorder2.addView(launcherBody);
launcherBorder2.setPadding(10,0,10,10);
launcherBorder.addView(launcherBorder2);
launcherBorder.setPadding(10,0,10,20);
launcher.addView(launcherBorder);
TextView titleView = new TextView(this);
titleView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
titleView.setText("Command-line arguments");
titleView.setTextAppearance(this, android.R.attr.textAppearanceLarge);
cmdArgs = new EditText(this);
cmdArgs.setLayoutParams(buttonparams);
cmdArgs.setSingleLine(true);
if(sdk < 21)
{
cmdArgs.setBackgroundColor(0xFF353535);
cmdArgs.setTextColor(0xFFFFFFFF);
cmdArgs.setPadding(5,5,5,5);
}
Button startButton = new Button(this);
// Set launch button title here
startButton.setText(styleButtonString("Launch " + "TFC15-Client" + "!"));
LayoutParams buttonParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
buttonParams.gravity = 5;
startButton.setLayoutParams(buttonParams);
if(sdk < 21)
{
startButton.getBackground().setAlpha(96);
startButton.getBackground().invalidateSelf();
startButton.setTextColor(0xFFFFFFFF);
startButton.setTextAppearance(this, android.R.attr.textAppearanceLarge);
startButton.setTextSize(20);
}
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startXash(v);
}
});
launcherBody.addView(titleView);
launcherBody.addView(cmdArgs);
// Add other options here
launcher.addView(startButton);
setContentView(launcher);
mPref = getSharedPreferences("mod", 0);
cmdArgs.setText(mPref.getString("argv","-dev 3 -log"));
// Uncomment this if you have pak file
// ExtractAssets.extractPAK(this, false);
}
private Intent prepareIntent(Intent i)
{
String argv = cmdArgs.getText().toString();
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
SharedPreferences.Editor editor = mPref.edit();
editor.putString("argv", argv);
editor.commit();
// Command-line arguments
// if not passed, uses arguments from xash3d package
// Uncoment this if you are using client from other package
/*
String libserver = getFilesDir().getAbsolutePath().replace("/files","/lib/libserver_hardfp.so");
if( !(new File(libserver).exists()) )
libserver = getFilesDir().getAbsolutePath().replace("/files","/lib/libserver.so");
argv = "-dll "+ libserver + " " + argv;
*/
if(argv.length() != 0)
i.putExtra("argv", argv);
// default gamedir
// may be overriden by -game command-line option
// Uncomment to set gamedir here
i.putExtra("gamedir", "tfc" );
// default library package
// if you are using client from other package (not from half-life),
// replace following line by:
/*i.putExtra("gamelibdir", "/data/data/<clientpkgname>/lib");*/
i.putExtra("gamelibdir", getFilesDir().getAbsolutePath().replace("/files","/lib"));
// if you are using pak file, uncomment this:
// i.putExtra("pakfile", getFilesDir().getAbsolutePath() + "/extras.pak");
// you may pass extra enviroment variables to game
// it is availiable from game code with getenv() function
/*
String envp[] =
{
"VAR1", "value1",
"VAR2", "value2"
};
i.putExtra("env", envp);
*/
return i;
}
public void startXash(View view)
{
try
{
Intent intent = new Intent();
intent.setAction("in.celest.xash3d.START");
intent = prepareIntent(intent);
startActivity(intent);
return;
}
catch(Exception e){}
// some samsung devices have
// completely broken intent resolver
// so try specify exact component here
try
{
Intent intent = new Intent();
intent.setComponent(new ComponentName("in.celest.xash3d.hl.test", "in.celest.xash3d.XashActivity"));
intent = prepareIntent(intent);
startActivity(intent);
return;
}
catch(Exception e){}
try
{
Intent intent = new Intent();
intent.setComponent(new ComponentName("in.celest.xash3d.hl", "in.celest.xash3d.XashActivity"));
intent = prepareIntent(intent);
startActivity(intent);
return;
}
catch(Exception e){}
new AlertDialog.Builder(this)
.setTitle("Error")
.setMessage("Failed to start Xash3D FWGS engine\nIs it installed?")
.setCancelable(false)
.setPositiveButton("Ok", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface i, int w){
LauncherActivity.this.finish();
}
}).show();
}
}

View File

@ -24,25 +24,26 @@ LOCAL_CFLAGS += -DCLIENT_DLL=1
SRCS=
SRCS_C=
SRCS+=../dlls/crossbow.cpp
SRCS+=../dlls/crowbar.cpp
SRCS+=../dlls/egon.cpp
SRCS+=./ev_hldm.cpp
SRCS+=../dlls/gauss.cpp
SRCS+=../dlls/handgrenade.cpp
SRCS+=./tfc/ev_tfc.cpp
SRCS+=./hl/hl_baseentity.cpp
SRCS+=./hl/hl_events.cpp
SRCS+=./tfc/tfc_events.cpp
SRCS+=./hl/hl_objects.cpp
SRCS+=./hl/hl_weapons.cpp
SRCS+=../dlls/hornetgun.cpp
SRCS+=../dlls/mp5.cpp
SRCS+=../dlls/python.cpp
SRCS+=../dlls/rpg.cpp
SRCS+=../dlls/satchel.cpp
SRCS+=../dlls/shotgun.cpp
SRCS+=../dlls/squeakgrenade.cpp
SRCS+=../dlls/tripmine.cpp
SRCS+=../dlls/glock.cpp
SRCS+=./tfc/tfc_weapons.cpp
SRCS+=../dlls/crowbar.cpp
SRCS+=../dlls/tfc/assaultcannon.cpp
SRCS+=../dlls/tfc/axe.cpp
SRCS+=../dlls/tfc/flamethrower.cpp
SRCS+=../dlls/tfc/grenadelauncher.cpp
SRCS+=../dlls/tfc/incendiarycannon.cpp
SRCS+=../dlls/tfc/nailgun.cpp
SRCS+=../dlls/tfc/pipebomblauncher.cpp
SRCS+=../dlls/tfc/railgun.cpp
SRCS+=../dlls/tfc/rpg.cpp
SRCS+=../dlls/tfc/shotgun.cpp
SRCS+=../dlls/tfc/sniperrifle.cpp
SRCS+=../dlls/tfc/spanner.cpp
SRCS+=../dlls/tfc/supernailgun.cpp
SRCS+=../dlls/tfc/supershotgun.cpp
#SRCS+=../game_shared/voice_banmgr.cpp
#SRCS+=../game_shared/voice_status.cpp
SRCS+=./ammo.cpp
@ -100,6 +101,7 @@ LOCAL_C_INCLUDES := $(LOCAL_PATH)/. \
$(LOCAL_PATH)/../game_shared \
$(LOCAL_PATH)/../dlls \
$(LOCAL_PATH)/../pm_shared \
$(LOCAL_PATH)/../dlls/tfc \
$(LOCAL_PATH)/../utils/false_vgui/include
LOCAL_CFLAGS += $(DEFINES) $(INCLUDES)

View File

@ -29,7 +29,7 @@
extern BEAM *pBeam;
extern BEAM *pBeam2;
extern TEMPENTITY *pFlare; // Vit_amiN: egon's energy flare
//extern TEMPENTITY *pFlare; // Vit_amiN: egon's energy flare
void HUD_GetLastOrg( float *org );
void UpdateBeams( void )
@ -76,7 +76,7 @@ void UpdateBeams( void )
pBeam2->target = tr.endpos;
pBeam2->die = gEngfuncs.GetClientTime() + 0.1; // We keep it alive just a little bit forward in the future, just in case.
}
/*
if( pFlare ) // Vit_amiN: beam flare
{
pFlare->entity.origin = tr.endpos;
@ -98,6 +98,7 @@ void UpdateBeams( void )
}
}
}
*/
}
/*
@ -109,6 +110,8 @@ Add game specific, client-side objects here
*/
void Game_AddObjects( void )
{
/*
if( pBeam || pBeam2 || pFlare ) // Vit_amiN: egon flare added
UpdateBeams();
*/
}

View File

@ -28,6 +28,9 @@
#include "demo.h"
#include "demo_api.h"
#define MENU_TEAM 2
#define MENU_CLASS 3
cvar_t *hud_textmode;
float g_hud_text_color[3];
@ -123,7 +126,7 @@ int __MsgFunc_Detpack( const char *pszName, int iSize, void *pbuf )
int __MsgFunc_VGUIMenu( const char *pszName, int iSize, void *pbuf )
{
return 0;
return gHUD.MsgFunc_VGUIMenu( pszName, iSize, pbuf );
}
int __MsgFunc_BuildSt( const char *pszName, int iSize, void *pbuf )
@ -148,7 +151,7 @@ int __MsgFunc_Spectator( const char *pszName, int iSize, void *pbuf )
int __MsgFunc_AllowSpec( const char *pszName, int iSize, void *pbuf )
{
return 0;
return gHUD.MsgFunc_AllowSpec( pszName, iSize, pbuf );
}
// This is called every time the DLL is loaded
@ -587,3 +590,42 @@ float CHud::GetSensitivity( void )
{
return m_flMouseSensitivity;
}
int CHud::MsgFunc_AllowSpec( const char *pszName, int iSize, void *pbuf )
{
BEGIN_READ( pbuf, iSize );
m_bAllowSpec = (bool)READ_BYTE();
return 1;
}
int CHud::MsgFunc_VGUIMenu( const char *pszName, int iSize, void *pbuf )
{
BEGIN_READ( pbuf, iSize );
int menuType = READ_BYTE();
//m_bitsValidSlots = READ_SHORT(); // is ignored
ShowVGUIMenu(menuType);
return 1;
}
void CHud::ShowVGUIMenu( int menuType )
{
char *szCmd;
switch(menuType)
{
case MENU_TEAM:
szCmd = "exec touch/chooseteam.cfg";
break;
default:
szCmd = "touch_removebutton _menu_*"; // back to the default touch page
//m_fMenuDisplayed = 0;
break;
}
//Velaron: Touch Menus
//m_fMenuDisplayed = 1;
ClientCmd(szCmd);
}

View File

@ -420,6 +420,7 @@ private:
wrect_t *m_prc1;
wrect_t *m_prc2;
int m_iBat;
int m_iBatMax;
float m_fFade;
int m_iHeight; // width of the battery innards
};
@ -597,6 +598,8 @@ public:
int DrawHudStringLen( const char *szIt );
void DrawDarkRectangle( int x, int y, int wide, int tall );
bool m_bAllowSpec;
private:
// the memory for these arrays are allocated in the first call to CHud::VidInit(), when the hud.txt and associated sprites are loaded.
// freed in ~CHud()
@ -655,6 +658,9 @@ public:
int _cdecl MsgFunc_SetFOV( const char *pszName, int iSize, void *pbuf );
int _cdecl MsgFunc_Concuss( const char *pszName, int iSize, void *pbuf );
int _cdecl MsgFunc_AllowSpec( const char *pszName, int iSize, void *pbuf );
int _cdecl MsgFunc_VGUIMenu( const char *pszName, int iSize, void *pbuf );
// Screen information
SCREENINFO m_scrinfo;
@ -670,6 +676,8 @@ public:
void AddHudElem( CHudBase *p );
float GetSensitivity();
void ShowVGUIMenu( int menuType );
};
extern CHud gHUD;

View File

@ -25,7 +25,7 @@
extern BEAM *pBeam;
extern BEAM *pBeam2;
extern TEMPENTITY *pFlare; // Vit_amiN
//extern TEMPENTITY *pFlare; // Vit_amiN
extern float g_lastFOV; // Vit_amiN
@ -79,7 +79,7 @@ void CHud::MsgFunc_InitHUD( const char *pszName, int iSize, void *pbuf )
//Probably not a good place to put this.
pBeam = pBeam2 = NULL;
pFlare = NULL; // Vit_amiN: clear egon's beam flare
//pFlare = NULL; // Vit_amiN: clear egon's beam flare
}
int CHud::MsgFunc_GameMode( const char *pszName, int iSize, void *pbuf )

2225
cl_dll/tfc/ev_tfc.cpp Normal file

File diff suppressed because it is too large Load Diff

42
cl_dll/tfc/ev_tfc.h Normal file
View File

@ -0,0 +1,42 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================
#if !defined ( EV_HLDMH )
#define EV_HLDMH
// bullet types
typedef enum
{
BULLET_NONE = 0,
BULLET_PLAYER_9MM, // glock
BULLET_PLAYER_MP5, // mp5
BULLET_PLAYER_357, // python
BULLET_PLAYER_BUCKSHOT, // shotgun
BULLET_PLAYER_CROWBAR, // crowbar swipe
BULLET_MONSTER_9MM,
BULLET_MONSTER_MP5,
BULLET_MONSTER_12MM
}Bullet;
void EV_HLDM_GunshotDecalTrace( pmtrace_t *pTrace, char *decalName );
void EV_HLDM_DecalGunshot( pmtrace_t *pTrace, int iBulletType );
int EV_HLDM_CheckTracer( int idx, float *vecSrc, float *end, float *forward, float *right, int iBulletType, int iTracerFreq, int *tracerCount );
void EV_HLDM_FireBullets( int idx, float *forward, float *right, float *up, int cShots, float *vecSrc, float *vecDirShooting, float flDistance, int iBulletType, int iTracerFreq, int *tracerCount, float flSpreadX, float flSpreadY );
void EV_TFC_NailTouch( struct tempent_s *ent, pmtrace_t *ptr );
void EV_TFC_Explode( float *org, int dmg, pmtrace_t *pTrace, qboolean bDontSpark );
void EV_TFC_BloodDrips( float *vecOrigin, signed int iDamage, long double height );
void EV_TFC_TraceAttack( int idx, float *vecDir, pmtrace_t *ptr, float flDamage );
long double EV_TFC_WaterLevel( float *position, float minz, float maxz );
void EV_TFC_RailDie( struct particle_s *particle );
int EV_TFC_IsAlly( int idx1, int idx2 );
void EV_TFC_TranqNailTouch( tempent_s *ent, pmtrace_t *ptr );
void EV_TFC_PlayAxeSound( int idx, int classid, float *origin, int iSoundType, float fSoundData );
int EV_TFC_AxeHit(int idx, float *origin, float *forward, float *right, int entity, float *vecDir, pmtrace_t *ptr);
int EV_TFC_Medkit(int idx, float *origin, float *forward, float *right, int entity, float *vecDir, pmtrace_t *ptr);
//tempent_s EV_TFC_CreateGib(float *origin, float *attackdir, int multiplier, int ishead);
#endif // EV_HLDMH

129
cl_dll/tfc/tfc_events.cpp Normal file
View File

@ -0,0 +1,129 @@
/***
*
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
*
* This product contains software technology licensed from Id
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
* All Rights Reserved.
*
* Use, distribution, and modification of this source code and/or resulting
* object code is restricted to non-commercial enhancements to products from
* Valve LLC. All other use, distribution, or modification is prohibited
* without written permission from Valve LLC.
*
****/
#include "../hud.h"
#include "../cl_util.h"
#include "event_api.h"
extern "C"
{
void EV_TFC_Axe( struct event_args_s *args );
void EV_FireTFCShotgun( struct event_args_s *args );
void EV_FireTFCSuperShotgun( struct event_args_s *args );
void EV_ReloadTFCShotgun( struct event_args_s *args );
void EV_PumpTFCShotgun( struct event_args_s *args );
void EV_FireTFCNailgun( struct event_args_s *args );
void EV_FireTFCSuperNailgun( struct event_args_s *args );
void EV_FireTFCAutoRifle( struct event_args_s *args );
void EV_TFC_Gas( struct event_args_s *args );
void EV_TFC_DoorGoUp( struct event_args_s *args );
void EV_TFC_DoorGoDown( struct event_args_s *args );
void EV_TFC_DoorHitTop( struct event_args_s *args );
void EV_TFC_DoorHitBottom( struct event_args_s *args );
void EV_TFC_Explosion( struct event_args_s *args );
void EV_TFC_Grenade( struct event_args_s *args );
void EV_TFC_NormalGrenade( struct event_args_s *args );
void EV_TFC_FireRPG( struct event_args_s *args );
void EV_FireTFCSniper( struct event_args_s *args );
void EV_TFC_SniperHit( struct event_args_s *args );
void EV_TFC_FireIC( struct event_args_s *args );
void EV_TFC_NailgrenadeNail( struct event_args_s *args );
void EV_TFC_GrenadeLauncher( struct event_args_s *args );
void EV_TFC_PipeLauncher( struct event_args_s *args );
void EV_TFC_NormalShot( struct event_args_s *args );
void EV_TFC_SuperShot( struct event_args_s *args );
void EV_TFC_SteamShot( struct event_args_s *args );
void EV_TFC_EngineerGrenade( struct event_args_s *args );
void EV_TFC_Concussion( struct event_args_s *args );
void EV_TFC_Assault_WindUp( struct event_args_s *args );
void EV_TFC_Assault_WindDown( struct event_args_s *args );
void EV_TFC_Assault_Start( struct event_args_s *args );
void EV_TFC_Assault_Fire( struct event_args_s *args );
void EV_TFC_Assault_Spin( struct event_args_s *args );
void EV_TFC_Assault_StartSpin( struct event_args_s *args );
void EV_TFC_AxeDecal( struct event_args_s *args );
void EV_TFC_NapalmFire( struct event_args_s *args );
void EV_TFC_MirvGrenadeMain( struct event_args_s *args );
void EV_TFC_MirvGrenade( struct event_args_s *args );
void EV_TFC_NapalmBurn( struct event_args_s *args );
void EV_TFC_EMP( struct event_args_s *args );
void EV_TFC_Flame_Fire( struct event_args_s *args );
void EV_TFC_Railgun( struct event_args_s *args );
void EV_TFC_Tranquilizer( struct event_args_s *args );
void EV_TFC_NailGrenade( struct event_args_s *args );
void EV_TrainPitchAdjust( struct event_args_s *args );
}
/*
======================
Game_HookEvents
Associate script file name with callback functions. Callback's must be extern "C" so
the engine doesn't get confused about name mangling stuff. Note that the format is
always the same. Of course, a clever mod team could actually embed parameters, behavior
into the actual .sc files and create a .sc file parser and hook their functionality through
that.. i.e., a scripting system.
That was what we were going to do, but we ran out of time...oh well.
======================
*/
void Game_HookEvents( void )
{
gEngfuncs.pfnHookEvent("events/wpn/tf_axe.sc", EV_TFC_Axe);
gEngfuncs.pfnHookEvent("events/wpn/tf_sg.sc", EV_FireTFCShotgun);
gEngfuncs.pfnHookEvent("events/wpn/tf_sgreload.sc", EV_ReloadTFCShotgun);
gEngfuncs.pfnHookEvent("events/wpn/tf_sgpump.sc", EV_PumpTFCShotgun);
gEngfuncs.pfnHookEvent("events/wpn/tf_nail.sc", EV_FireTFCNailgun);
gEngfuncs.pfnHookEvent("events/wpn/tf_snail.sc", EV_FireTFCSuperNailgun);
gEngfuncs.pfnHookEvent("events/wpn/tf_ssg.sc", EV_FireTFCSuperShotgun);
gEngfuncs.pfnHookEvent("events/wpn/tf_ar.sc", EV_FireTFCAutoRifle);
gEngfuncs.pfnHookEvent("events/explode/tf_gas.sc", EV_TFC_Gas);
gEngfuncs.pfnHookEvent("events/door/doorgoup.sc", EV_TFC_DoorGoUp);
gEngfuncs.pfnHookEvent("events/door/doorgodown.sc", EV_TFC_DoorGoDown);
gEngfuncs.pfnHookEvent("events/door/doorhittop.sc", EV_TFC_DoorHitTop);
gEngfuncs.pfnHookEvent("events/door/doorhitbottom.sc", EV_TFC_DoorHitBottom);
gEngfuncs.pfnHookEvent("events/explode/tf_pipe.sc", EV_TFC_Explosion);
gEngfuncs.pfnHookEvent("events/explode/tf_gren.sc", EV_TFC_Grenade);
gEngfuncs.pfnHookEvent("events/explode/tf_normalgren.sc", EV_TFC_NormalGrenade);
gEngfuncs.pfnHookEvent("events/wpn/tf_rpg.sc", EV_TFC_FireRPG);
gEngfuncs.pfnHookEvent("events/wpn/tf_sniper.sc", EV_FireTFCSniper);
gEngfuncs.pfnHookEvent("events/wpn/tf_sniperhit.sc", EV_TFC_SniperHit);
gEngfuncs.pfnHookEvent("events/wpn/tf_ic.sc", EV_TFC_FireIC);
gEngfuncs.pfnHookEvent("events/explode/tf_nailgren.sc", EV_TFC_NailgrenadeNail);
gEngfuncs.pfnHookEvent("events/wpn/tf_gl.sc", EV_TFC_GrenadeLauncher);
gEngfuncs.pfnHookEvent("events/wpn/tf_pipel.sc", EV_TFC_PipeLauncher);
gEngfuncs.pfnHookEvent("events/wpn/tf_mednormal.sc", EV_TFC_NormalShot);
gEngfuncs.pfnHookEvent("events/wpn/tf_medsuper.sc", EV_TFC_SuperShot);
gEngfuncs.pfnHookEvent("events/wpn/tf_medsteam.sc", EV_TFC_SteamShot);
gEngfuncs.pfnHookEvent("events/explode/tf_engrgren.sc", EV_TFC_EngineerGrenade);
gEngfuncs.pfnHookEvent("events/explode/tf_concuss.sc", EV_TFC_Concussion);
gEngfuncs.pfnHookEvent("events/wpn/tf_acwu.sc", EV_TFC_Assault_WindUp);
gEngfuncs.pfnHookEvent("events/wpn/tf_acwd.sc", EV_TFC_Assault_WindDown);
gEngfuncs.pfnHookEvent("events/wpn/tf_acstart.sc", EV_TFC_Assault_Start);
gEngfuncs.pfnHookEvent("events/wpn/tf_acfire.sc", EV_TFC_Assault_Fire);
gEngfuncs.pfnHookEvent("events/wpn/tf_acspin.sc", EV_TFC_Assault_Spin);
gEngfuncs.pfnHookEvent("events/wpn/tf_acsspin.sc", EV_TFC_Assault_StartSpin);
gEngfuncs.pfnHookEvent("events/wpn/tf_axedecal.sc", EV_TFC_AxeDecal);
gEngfuncs.pfnHookEvent("events/explode/tf_mirvmain.sc", EV_TFC_MirvGrenadeMain);
gEngfuncs.pfnHookEvent("events/explode/tf_mirv.sc", EV_TFC_MirvGrenade);
gEngfuncs.pfnHookEvent("events/explode/tf_fire.sc", EV_TFC_NapalmFire);
gEngfuncs.pfnHookEvent("events/explode/tf_burn.sc", EV_TFC_NapalmBurn);
gEngfuncs.pfnHookEvent("events/explode/tf_emp.sc", EV_TFC_EMP);
gEngfuncs.pfnHookEvent("events/wpn/tf_flame.sc", EV_TFC_Flame_Fire);
gEngfuncs.pfnHookEvent("events/wpn/tf_rail.sc", EV_TFC_Railgun);
gEngfuncs.pfnHookEvent("events/wpn/tf_tranq.sc", EV_TFC_Tranquilizer);
gEngfuncs.pfnHookEvent("events/explode/tf_ng.sc", EV_TFC_NailGrenade);
}

View File

@ -21,6 +21,8 @@
#include "nodes.h"
#include "player.h"
#include "tf_defs.h"
#include "usercmd.h"
#include "entity_state.h"
#include "demo_api.h"
@ -52,21 +54,21 @@ int g_irunninggausspred = 0;
vec3_t previousorigin;
// HLDM Weapon placeholder entities.
CGlock g_Glock;
CCrowbar g_Crowbar;
CPython g_Python;
CMP5 g_Mp5;
CCrossbow g_Crossbow;
CShotgun g_Shotgun;
CRpg g_Rpg;
CGauss g_Gauss;
CEgon g_Egon;
CHgun g_HGun;
CHandGrenade g_HandGren;
CSatchel g_Satchel;
CTripmine g_Tripmine;
CSqueak g_Snark;
// TFC Weapons
CTFShotgun g_TFShotgun;
CTFSuperShotgun g_TFSuperShotgun;
CTFNailgun g_TFNailgun;
CTFSuperNailgun g_TFSuperNailgun;
CTFSniperRifle g_TFSniperRifle;
CTFRpg g_TFRpg;
CTFIncendiaryC g_TFIncediaryC;
CTFFlamethrower g_TFFlamethrower;
CTFAxe g_TFAxe;
CTFSpanner g_TFSpanner;
CTFRailgun g_TFRailgun;
CTFGrenadeLauncher g_TFGrenadeLauncher;
CTFAssaultC g_TFAssaultC;
CTFPipebombLauncher g_TFPipebombLauncher;
/*
======================
@ -602,20 +604,20 @@ void HUD_InitClientWeapons( void )
HUD_PrepEntity( &player, NULL );
// Allocate slot(s) for each weapon that we are going to be predicting
HUD_PrepEntity( &g_Glock, &player );
HUD_PrepEntity( &g_Crowbar, &player );
HUD_PrepEntity( &g_Python, &player );
HUD_PrepEntity( &g_Mp5, &player );
HUD_PrepEntity( &g_Crossbow, &player );
HUD_PrepEntity( &g_Shotgun, &player );
HUD_PrepEntity( &g_Rpg, &player );
HUD_PrepEntity( &g_Gauss, &player );
HUD_PrepEntity( &g_Egon, &player );
HUD_PrepEntity( &g_HGun, &player );
HUD_PrepEntity( &g_HandGren, &player );
HUD_PrepEntity( &g_Satchel, &player );
HUD_PrepEntity( &g_Tripmine, &player );
HUD_PrepEntity( &g_Snark, &player );
HUD_PrepEntity( &g_TFShotgun, &player );
HUD_PrepEntity( &g_TFSuperShotgun, &player );
HUD_PrepEntity( &g_TFNailgun, &player );
HUD_PrepEntity( &g_TFSuperNailgun, &player );
HUD_PrepEntity( &g_TFSniperRifle, &player );
HUD_PrepEntity( &g_TFRpg, &player );
HUD_PrepEntity( &g_TFIncediaryC, &player );
HUD_PrepEntity( &g_TFFlamethrower, &player );
HUD_PrepEntity( &g_TFAxe, &player );
HUD_PrepEntity( &g_TFSpanner, &player );
HUD_PrepEntity( &g_TFRailgun, &player );
HUD_PrepEntity( &g_TFGrenadeLauncher, &player );
HUD_PrepEntity( &g_TFAssaultC, &player );
HUD_PrepEntity( &g_TFPipebombLauncher, &player );
}
/*
@ -679,47 +681,71 @@ void HUD_WeaponsPostThink( local_state_s *from, local_state_s *to, usercmd_t *cm
// FIXME, make this a method in each weapon? where you pass in an entity_state_t *?
switch( from->client.m_iId )
{
case WEAPON_CROWBAR:
pWeapon = &g_Crowbar;
case WEAPON_HOOK:
//pWeapon = &;
break;
case WEAPON_GLOCK:
pWeapon = &g_Glock;
case WEAPON_BIOWEAPON:
//pWeapon = &;
break;
case WEAPON_PYTHON:
pWeapon = &g_Python;
case WEAPON_SPANNER:
pWeapon = &g_TFSpanner;
break;
case WEAPON_MP5:
pWeapon = &g_Mp5;
case WEAPON_AXE:
pWeapon = &g_TFAxe;
break;
case WEAPON_CROSSBOW:
pWeapon = &g_Crossbow;
case WEAPON_SNIPER_RIFLE:
pWeapon = &g_TFSniperRifle;
break;
case WEAPON_SHOTGUN:
pWeapon = &g_Shotgun;
case WEAPON_AUTO_RIFLE:
//pWeapon = &;
break;
case WEAPON_RPG:
pWeapon = &g_Rpg;
case WEAPON_TF_SHOTGUN:
pWeapon = &g_TFShotgun;
break;
case WEAPON_GAUSS:
pWeapon = &g_Gauss;
case WEAPON_SUPER_SHOTGUN:
pWeapon = &g_TFSuperShotgun;
break;
case WEAPON_EGON:
pWeapon = &g_Egon;
case WEAPON_NAILGUN:
pWeapon = &g_TFNailgun;
break;
case WEAPON_HORNETGUN:
pWeapon = &g_HGun;
case WEAPON_SUPER_NAILGUN:
pWeapon = &g_TFSuperNailgun;
break;
case WEAPON_HANDGRENADE:
pWeapon = &g_HandGren;
case WEAPON_GRENADE_LAUNCHER:
pWeapon = &g_TFGrenadeLauncher;
break;
case WEAPON_SATCHEL:
pWeapon = &g_Satchel;
case WEAPON_FLAMETHROWER:
pWeapon = &g_TFFlamethrower;
break;
case WEAPON_TRIPMINE:
pWeapon = &g_Tripmine;
case WEAPON_ROCKET_LAUNCHER:
pWeapon = &g_TFRpg;
break;
case WEAPON_SNARK:
pWeapon = &g_Snark;
case WEAPON_INCENDIARY:
pWeapon = &g_TFIncediaryC;
break;
case WEAPON_ASSAULT_CANNON:
pWeapon = &g_TFAssaultC;
break;
case WEAPON_LIGHTNING:
//pWeapon = &;
break;
case WEAPON_DETPACK:
//pWeapon = &;
break;
case WEAPON_TRANQ:
//pWeapon = &;
break;
case WEAPON_LASER:
pWeapon = &g_TFRailgun;
break;
case WEAPON_PIPEBOMB_LAUNCHER:
pWeapon = &g_TFPipebombLauncher;
break;
case WEAPON_KNIFE:
//pWeapon = &;
break;
case WEAPON_BENCHMARK:
//pWeapon = &;
break;
}
@ -824,13 +850,13 @@ void HUD_WeaponsPostThink( local_state_s *from, local_state_s *to, usercmd_t *cm
{
player.m_pActiveItem = g_pWpns[from->client.m_iId];
}
/*
if( player.m_pActiveItem->m_iId == WEAPON_RPG )
{
( (CRpg *)player.m_pActiveItem )->m_fSpotActive = (int)from->client.vuser2[1];
( (CRpg *)player.m_pActiveItem )->m_cActiveRockets = (int)from->client.vuser2[2];
}
*/
// Don't go firing anything if we have died.
// Or if we don't have a weapon model deployed
if( ( player.pev->deadflag != ( DEAD_DISCARDBODY + 1 ) ) &&
@ -892,7 +918,7 @@ void HUD_WeaponsPostThink( local_state_s *from, local_state_s *to, usercmd_t *cm
to->client.ammo_cells = player.ammo_uranium;
to->client.vuser2[0] = player.ammo_hornets;
to->client.ammo_rockets = player.ammo_rockets;
/*
if( player.m_pActiveItem->m_iId == WEAPON_RPG )
{
from->client.vuser2[1] = ( (CRpg *)player.m_pActiveItem)->m_fSpotActive;
@ -916,7 +942,7 @@ void HUD_WeaponsPostThink( local_state_s *from, local_state_s *to, usercmd_t *cm
// Force a fixed anim down to viewmodel
HUD_SendWeaponAnim( to->client.weaponanim, body, 1 );
}
*/
for( i = 0; i < 32; i++ )
{
pCurrent = g_pWpns[i];

View File

@ -1313,21 +1313,21 @@ int V_FindViewModelByWeaponModel( int weaponindex )
{
static const char *modelmap[][2] =
{
{ "models/p_crossbow.mdl", "models/v_crossbow.mdl" },
{ "models/p_crowbar.mdl", "models/v_crowbar.mdl" },
{ "models/p_egon.mdl", "models/v_egon.mdl" },
{ "models/p_gauss.mdl", "models/v_gauss.mdl" },
{ "models/p_9mmhandgun.mdl", "models/v_9mmhandgun.mdl" },
{ "models/p_grenade.mdl", "models/v_grenade.mdl" },
{ "models/p_hgun.mdl", "models/v_hgun.mdl" },
{ "models/p_9mmAR.mdl", "models/v_9mmAR.mdl" },
{ "models/p_357.mdl", "models/v_357.mdl" },
{ "models/p_rpg.mdl", "models/v_rpg.mdl" },
{ "models/p_shotgun.mdl", "models/v_shotgun.mdl" },
{ "models/p_squeak.mdl", "models/v_squeak.mdl" },
{ "models/p_tripmine.mdl", "models/v_tripmine.mdl" },
{ "models/p_satchel_radio.mdl", "models/v_satchel_radio.mdl" },
{ "models/p_satchel.mdl", "models/v_satchel.mdl" },
{ "models/p_mini.mdl", "models/v_tfac.mdl" },
{ "models/p_sniper.mdl", "models/v_tfc_sniper.mdl" },
{ "models/p_umbrella.mdl", "models/v_umbrella.mdl" },
{ "models/p_crowbar.mdl", "models/v_tfc_crowbar.mdl" },
{ "models/p_spanner.mdl", "models/v_tfc_spanner.mdl" },
{ "models/p_knife.mdl", "models/v_tfc_knife.mdl" },
{ "models/p_medkit.mdl", "models/v_tfc_medkit.mdl" },
{ "models/p_egon.mdl", "models/v_flame.mdl" },
{ "models/p_glauncher.mdl", "models/v_tfgl.mdl" },
{ "models/p_rpg.mdl", "models/v_tfc_rpg.mdl" },
{ "models/p_nailgun.mdl", "models/v_tfc_nailgun.mdl" },
{ "models/p_snailgun.mdl", "models/v_tfc_supernailgun.mdl" },
{ "models/p_9mmhandgun.mdl", "models/v_tfc_railgun.mdl" },
{ "models/p_srpg.mdl", "models/v_tfc_rpg.mdl" },
{ "models/p_smallshotgun.mdl", "models/v_tfc_12gauge.mdl" },
{ NULL, NULL }
};

188
dlls/tfc/assaultcannon.cpp Normal file
View File

@ -0,0 +1,188 @@
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "gamerules.h"
LINK_ENTITY_TO_CLASS( tf_weapon_ac, CTFAssaultC )
void CTFAssaultC::Spawn()
{
Precache();
m_iId = 17;
m_iDefaultAmmo = 25;
m_iWeaponState = 0;
pev->solid = SOLID_TRIGGER;
}
int CTFAssaultC::GetItemInfo( ItemInfo *p )
{
p->pszAmmo1 = "buckshot";
p->pszName = STRING( pev->classname );
p->iMaxAmmo1 = 200;
p->pszAmmo2 = 0;
p->iMaxAmmo2 = -1;
p->iSlot = 4;
p->iPosition = 3;
p->iFlags = 0;
p->iMaxClip = -1;
p->iId = 17;
p->iWeight = 15;
return 1;
}
void CTFAssaultC::Holster()
{
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usWindDown, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, 0, 1, 0);
m_iWeaponState = 0;
//tfstate
//setspeed
m_fInReload = 0;
m_flTimeWeaponIdle = 2;
m_pPlayer->m_flNextAttack = 0.1;
SendWeaponAnim(ASSAULT_HOLSTER, 1);
}
void CTFAssaultC::Precache()
{
PRECACHE_MODEL("models/v_tfac.mdl");
PRECACHE_MODEL("models/p_mini.mdl");
PRECACHE_MODEL("models/p_mini2.mdl");
m_iShell = PRECACHE_MODEL("models/shell.mdl");
PRECACHE_SOUND("weapons/357_cock1.wav");
PRECACHE_SOUND("weapons/asscan1.wav");
PRECACHE_SOUND("weapons/asscan2.wav");
PRECACHE_SOUND("weapons/asscan3.wav");
PRECACHE_SOUND("weapons/asscan4.wav");
m_usWindUp = PRECACHE_EVENT(1, "events/wpn/tf_acwu.sc");
m_usWindDown = PRECACHE_EVENT(1, "events/wpn/tf_acwd.sc");
m_usFire = PRECACHE_EVENT(1, "events/wpn/tf_acfire.sc");
m_usStartSpin = PRECACHE_EVENT(1, "events/wpn/tf_acsspin.sc");
m_usSpin = PRECACHE_EVENT(1, "events/wpn/tf_acspin.sc");
m_usACStart = PRECACHE_EVENT(1, "events/wpn/tf_acstart.sc");
}
void CTFAssaultC::WeaponIdle( void )
{
ResetEmptySound();
if(m_flTimeWeaponIdle <= 0.0)
{
if(m_iWeaponState)
{
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usWindDown, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, 0, 0, 0);
m_iWeaponState = 0;
//tfstate
//setspeed
m_flTimeWeaponIdle = 2;
}
else
{
SendWeaponAnim(RANDOM_LONG(0, 1), 1);
m_flTimeWeaponIdle = 12.5;
}
}
}
BOOL CTFAssaultC::Deploy()
{
//Velaron: "ac" deploy
return DefaultDeploy( "models/v_tfac.mdl", "models/p_mini.mdl", ASSAULT_DRAW, "mp5", 1 );
}
int CTFAssaultC::AddToPlayer( CBasePlayer *pPlayer )
{
if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId );
MESSAGE_END();
return TRUE;
}
return FALSE;
}
void CTFAssaultC::PrimaryAttack()
{
if(m_iWeaponState == 2)
{
if(m_pPlayer->ammo_buckshot <= 0)
{
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usStartSpin, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, 0, 0, 0);
m_iWeaponState = 3;
m_pPlayer->SetAnimation(PLAYER_ATTACK1);
pev->effects &= ~EF_MUZZLEFLASH;
}
else
Fire();
m_flTimeWeaponIdle = 0.1;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.1;
return;
}
if(m_iWeaponState == 3)
{
if(m_pPlayer->ammo_buckshot <= 0)
{
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usSpin, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, 0, 0, 0);
m_pPlayer->SetAnimation(PLAYER_ATTACK1);
}
else
{
m_iWeaponState = 1;
}
m_flTimeWeaponIdle = 0.1;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.1;
return;
}
if(m_iWeaponState == 1)
{
if(m_flNextPrimaryAttack > 0.0)
return;
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usACStart, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, 0, 0, 0);
m_iWeaponState = 2;
m_flTimeWeaponIdle = 0.1;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.1;
return;
}
if(m_pPlayer->pev->button & 1)
{
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usWindUp, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, 0, 0, 0);
m_iWeaponState = 1;
//tfstate
//setspeed
}
m_flTimeWeaponIdle = 0.6;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5;
}
void CTFAssaultC::Fire()
{
vec3_t p_vecSrc, vecAiming, vecSpread;
if(m_flNextPrimaryAttack > 0)
return;
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usWindUp, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, 0, m_pPlayer->ammo_buckshot & 1, 0);
m_pPlayer->m_iWeaponVolume = 600;
m_pPlayer->m_iWeaponFlash = 256;
m_pPlayer->pev->effects |= EF_MUZZLEFLASH;
m_pPlayer->SetAnimation(PLAYER_ATTACK1);
UTIL_MakeVectors(m_pPlayer->pev->v_angle);
p_vecSrc.x = gpGlobals->v_up.x * -4.0 + gpGlobals->v_right.x + gpGlobals->v_right.x + m_pPlayer->pev->origin.x + m_pPlayer->pev->view_ofs.x;
p_vecSrc.y = gpGlobals->v_up.y * -4.0 + gpGlobals->v_right.y + gpGlobals->v_right.y + m_pPlayer->pev->origin.y + m_pPlayer->pev->view_ofs.y;
p_vecSrc.z = gpGlobals->v_up.z * -4.0 + gpGlobals->v_right.z + gpGlobals->v_right.z + m_pPlayer->pev->origin.z + m_pPlayer->pev->view_ofs.z;
vecAiming = m_pPlayer->GetAutoaimVector(0.087155744);
vecSpread.x = 0.1;
vecSpread.y = 0.1;
vecSpread.z = 0.0;
FireBullets(5, p_vecSrc, vecAiming, vecSpread, 8192.0, 7, 8, 7, 0);
m_pPlayer->ammo_buckshot--;
}

93
dlls/tfc/axe.cpp Normal file
View File

@ -0,0 +1,93 @@
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "gamerules.h"
LINK_ENTITY_TO_CLASS( tf_weapon_axe, CTFAxe )
void CTFAxe::Spawn()
{
Precache();
m_iId = 5;
m_iClip = -1;
pev->solid = SOLID_TRIGGER;
}
int CTFAxe::GetItemInfo( ItemInfo *p )
{
p->pszAmmo1 = 0;
p->pszName = STRING( pev->classname );
p->iMaxAmmo1 = -1;
p->pszAmmo2 = 0;
p->iMaxAmmo2 = -1;
p->iSlot = 0;
p->iPosition = 3;
p->iFlags = 0;
p->iMaxClip = -1;
p->iId = 5;
p->iWeight = 0;
return 1;
}
void CTFAxe::Holster()
{
SendWeaponAnim(AXE_HOLSTER, 1);
m_pPlayer->m_flNextAttack = 0.5;
}
void CTFAxe::Precache()
{
PRECACHE_MODEL("models/v_umbrella.mdl");
PRECACHE_MODEL("models/p_umbrella.mdl");
PRECACHE_MODEL("models/v_tfc_crowbar.mdl");
PRECACHE_MODEL("models/p_crowbar.mdl");
PRECACHE_MODEL("models/p_crowbar2.mdl");
PRECACHE_SOUND("weapons/cbar_hit1.wav");
PRECACHE_SOUND("weapons/cbar_hit2.wav");
PRECACHE_SOUND("weapons/cbar_hitbod1.wav");
PRECACHE_SOUND("weapons/cbar_hitbod2.wav");
PRECACHE_SOUND("weapons/cbar_hitbod3.wav");
PRECACHE_SOUND("weapons/cbar_miss1.wav");
classid = 3;
m_usAxe = PRECACHE_EVENT(1, "events/wpn/tf_axe.sc");
m_usAxeDecal = PRECACHE_EVENT(1, "events/wpn/tf_axedecal.sc");
}
BOOL CTFAxe::Deploy()
{
if(m_pPlayer->pev->playerclass == 11)
return DefaultDeploy( "models/v_umbrella.mdl", "models/p_umbrella.mdl", AXE_DRAW, "crowbar", 1 );
else
return DefaultDeploy( "models/v_tfc_crowbar.mdl", "models/p_crowbar.mdl", AXE_DRAW, "crowbar", 1 );
}
//Velaron: finish this?
void CTFAxe::PrimaryAttack()
{
vec3_t vecSrc, vecEnd;
TraceResult tr;
m_bHullHit = 0;
UTIL_MakeVectors(m_pPlayer->pev->v_angle);
vecSrc = m_pPlayer->GetGunPosition();
vecEnd.x = gpGlobals->v_forward.x * 32.0 + vecSrc.x;
vecEnd.y = gpGlobals->v_forward.y * 32.0 + vecSrc.y;
vecEnd.z = gpGlobals->v_forward.z * 32.0 + vecSrc.z;
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usAxe, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, classid, 0, 0, 0);
if ( tr.flFraction >= 1.0 )
{
m_bHullHit = 1;
//m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.4;
m_flNextPrimaryAttack = 1.0;
m_flTimeWeaponIdle = 5;
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
return;
}
m_flNextPrimaryAttack = 1.0;
m_flTimeWeaponIdle = 5;
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
}

120
dlls/tfc/flamethrower.cpp Normal file
View File

@ -0,0 +1,120 @@
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "gamerules.h"
LINK_ENTITY_TO_CLASS( tf_weapon_flamethrower, CTFFlamethrower )
void CTFFlamethrower::Spawn()
{
Precache();
m_iId = 13;
SET_MODEL(ENT(pev), "models/w_egon.mdl");
m_iDefaultAmmo = 50;
pev->solid = SOLID_TRIGGER;
}
int CTFFlamethrower::GetItemInfo( ItemInfo *p )
{
p->pszAmmo1 = "uranium";
p->pszName = STRING( pev->classname );
p->iMaxAmmo1 = 200;
p->pszAmmo2 = 0;
p->iMaxAmmo2 = -1;
p->iSlot = 3;
p->iPosition = 2;
p->iFlags = 0;
p->iMaxClip = -1;
p->iId = 13;
p->iWeight = 20;
return 1;
}
void CTFFlamethrower::Holster()
{
m_fInReload = 0;
SendWeaponAnim(10, 1);
m_pPlayer->m_flNextAttack = 0.5;
}
void CTFFlamethrower::Precache()
{
PRECACHE_MODEL("models/w_egon.mdl");
PRECACHE_MODEL("models/v_flame.mdl");
PRECACHE_MODEL("models/p_egon.mdl");
PRECACHE_MODEL("models/p_egon2.mdl");
PRECACHE_MODEL("models/w_9mmclip.mdl");
PRECACHE_SOUND("weapons/9mmclip1.wav");
UTIL_PrecacheOther("tf_flamethrower_burst");
PRECACHE_SOUND("weapons/flmfire2.wav");
m_usFireFlame = PRECACHE_EVENT(1, "events/wpn/tf_flame.sc");
}
void CTFFlamethrower::WeaponIdle( void )
{
ResetEmptySound();
if(m_flTimeWeaponIdle <= 0.0)
{
if(UTIL_SharedRandomLong(m_pPlayer->random_seed, 0, 4))
{
m_flTimeWeaponIdle = 12.5;
SendWeaponAnim(0, 1);
}
else
{
m_flTimeWeaponIdle = 3;
SendWeaponAnim(1, 1);
}
}
}
BOOL CTFFlamethrower::Deploy()
{
return DefaultDeploy( "models/v_flame.mdl", "models/p_egon.mdl", 5, "egon", 1 );
}
int CTFFlamethrower::AddToPlayer( CBasePlayer *pPlayer )
{
if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId );
MESSAGE_END();
return TRUE;
}
return FALSE;
}
void CTFFlamethrower::PrimaryAttack()
{
BOOL bUnderwater;
if(m_pPlayer->ammo_uranium <= 0)
{
PlayEmptySound();
return;
}
m_pPlayer->m_iWeaponVolume = 1000;
m_pPlayer->m_iWeaponFlash = 512;
bUnderwater = m_pPlayer->pev->waterlevel > 2;
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usFireFlame, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, 0, bUnderwater, 0);
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
if(bUnderwater)
{
m_flTimeWeaponIdle = 1;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1;
}
else
{
m_flTimeWeaponIdle = 0.15;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.15;
}
m_pPlayer->ammo_uranium--;
}

View File

@ -0,0 +1,174 @@
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "gamerules.h"
LINK_ENTITY_TO_CLASS( tf_weapon_gl, CTFGrenadeLauncher )
void CTFGrenadeLauncher::Spawn()
{
Precache();
SET_MODEL( ENT( pev ), "models/w_gauss.mdl" );
m_iId = 12;
m_iDefaultAmmo = 50;
m_fReloadTime = 0.666667;
pev->solid = SOLID_TRIGGER;
}
void CTFGrenadeLauncher::Precache()
{
PRECACHE_MODEL("models/v_tfgl.mdl");
PRECACHE_MODEL("models/p_glauncher.mdl");
PRECACHE_MODEL("models/p_p_glauncher2rpg.mdl");
PRECACHE_MODEL("models/pipebomb.mdl");
PRECACHE_SOUND("weapons/9mmclip1.wav");
PRECACHE_SOUND("items/clipinsert1.wav");
PRECACHE_SOUND("items/cliprelease1.wav");
PRECACHE_SOUND("weapons/hks1.wav");
PRECACHE_SOUND("weapons/hks2.wav");
PRECACHE_SOUND("weapons/hks3.wav");
PRECACHE_SOUND("weapons/glauncher.wav");
PRECACHE_SOUND("weapons/glauncher2.wav");
PRECACHE_SOUND("weapons/357_cock1.wav");
m_usFireGL = PRECACHE_EVENT(1, "events/wpn/tf_gl.sc");
}
int CTFGrenadeLauncher::GetItemInfo( ItemInfo *p )
{
p->pszAmmo1 = "rockets";
p->pszName = STRING( pev->classname );
p->iMaxAmmo1 = 50;
p->pszAmmo2 = 0;
p->iMaxAmmo2 = -1;
p->iSlot = 3;
p->iPosition = 3;
p->iFlags = 0;
p->iMaxClip = 6;
p->iId = 12;
p->iWeight = 15;
return 1;
}
void CTFGrenadeLauncher::Holster()
{
//m_pPlayer->m_iGLClip = m_iClip;
//tfstate?
m_fInSpecialReload = 0;
SendWeaponAnim(10, 1);
m_flTimeWeaponIdle = 1000;
m_pPlayer->m_flNextAttack = 0.5;
}
BOOL CTFGrenadeLauncher::Deploy()
{
return DefaultDeploy( "models/v_tfgl.mdl", "models/p_glauncher.mdl", 8, "mp5", 1 );
}
void CTFGrenadeLauncher::Reload()
{
if ( m_pPlayer->ammo_rockets > 0 )
{
if ( m_iClip != 6 && m_flNextReload <= 0.0 && m_flNextPrimaryAttack <= 0.0 )
{
if (m_fInSpecialReload)
{
if ( m_fInSpecialReload == 1 )
{
if ( m_flTimeWeaponIdle <= 0.0 )
{
m_fInSpecialReload = 2;
m_flNextReload = m_fReloadTime;
m_flTimeWeaponIdle = m_fReloadTime;
}
}
else
{
m_iClip++;
m_pPlayer->ammo_rockets--;
m_fInSpecialReload = 1;
//m_pPlayer->tfstate &= 2;
}
}
else
{
SendWeaponAnim(4, 1);
//m_pPlayer->tfstate |= 2;
m_fInSpecialReload = 1;
m_pPlayer->m_flNextAttack = 0.1;
m_flTimeWeaponIdle = 0.1;
m_flNextSecondaryAttack = 0.1;
m_flNextPrimaryAttack = 0.0;
}
}
}
}
int CTFGrenadeLauncher::AddToPlayer( CBasePlayer *pPlayer )
{
if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId );
MESSAGE_END();
return TRUE;
}
return FALSE;
}
void CTFGrenadeLauncher::WeaponIdle( void )
{
ResetEmptySound();
if(m_flTimeWeaponIdle > 0.0)
return;
if(m_iClip > 0)
{
if(m_fInSpecialReload)
{
if(m_iClip == 6)
{
SendWeaponAnim(5, 1);
m_fInSpecialReload = 0;
m_flTimeWeaponIdle = 1.5;
return;
}
if(m_pPlayer->ammo_rockets > 0)
{
Reload();
return;
}
}
}
m_flTimeWeaponIdle = 3;
SendWeaponAnim(0, 1);
}
void CTFGrenadeLauncher::PrimaryAttack()
{
if(m_pPlayer->ammo_rockets <= 0)
{
m_flNextPrimaryAttack = 1;
SendWeaponAnim(0, 1);
PlayEmptySound();
m_fInSpecialReload = 0;
//tfstate
return;
}
m_pPlayer->m_iWeaponVolume = 1000;
m_pPlayer->m_iWeaponFlash = 512;
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usFireGL, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, 0, 0, 0);
m_fInSpecialReload = 0;
//tfstate
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
m_iClip--;
m_flTimeWeaponIdle = 0.6;
m_flNextPrimaryAttack = 0.6;
m_flNextSecondaryAttack = 0.6;
}

View File

@ -0,0 +1,107 @@
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "gamerules.h"
LINK_ENTITY_TO_CLASS( tf_weapon_ic, CTFIncendiaryC )
void CTFIncendiaryC::Spawn()
{
Precache();
m_iId = 15;
SET_MODEL(ENT(pev), "models/w_rpg.mdl");
m_iDefaultAmmo = 50;
pev->solid = SOLID_TRIGGER;
}
int CTFIncendiaryC::GetItemInfo( ItemInfo *p )
{
p->pszAmmo1 = "rockets";
p->pszName = STRING( pev->classname );
p->iMaxAmmo1 = 20;
p->pszAmmo2 = 0;
p->iMaxAmmo2 = -1;
p->iSlot = 4;
p->iPosition = 2;
p->iFlags = 0;
p->iMaxClip = -1;
p->iId = 15;
p->iWeight = 20;
return 1;
}
void CTFIncendiaryC::Holster()
{
m_fInReload = 0;
SendWeaponAnim(4, 1);
m_pPlayer->m_flNextAttack = 0.5;
}
void CTFIncendiaryC::Precache()
{
PRECACHE_MODEL("models/w_rpg.mdl");
PRECACHE_MODEL("models/v_rpg.mdl");
PRECACHE_MODEL("models/p_rpg.mdl");
PRECACHE_MODEL("models/p_rpg2.mdl");
PRECACHE_SOUND("weapons/9mmclip1.wav");
UTIL_PrecacheOther("tf_ic_rocket");
PRECACHE_SOUND("weapons/rocketfire1.wav");
PRECACHE_SOUND("weapons/glauncher.wav");
m_usFireIC = PRECACHE_EVENT(1, "events/wpn/tf_ic.sc");
}
void CTFIncendiaryC::WeaponIdle( void )
{
if(m_flTimeWeaponIdle <= 0.0)
{
if(m_pPlayer->ammo_rockets <= 0)
m_flTimeWeaponIdle = 1;
else
{
m_flTimeWeaponIdle = 3;
SendWeaponAnim(1, 1);
}
}
}
BOOL CTFIncendiaryC::Deploy()
{
if(m_iClip >= 0)
return DefaultDeploy( "models/v_rpg.mdl", "models/p_rpg.mdl", 5, "rpg", 1 );
else
return DefaultDeploy( "models/v_tfc_rpg.mdl", "models/p_rpg.mdl", 7, "rpg", 1 );
}
int CTFIncendiaryC::AddToPlayer( CBasePlayer *pPlayer )
{
if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId );
MESSAGE_END();
return TRUE;
}
return FALSE;
}
void CTFIncendiaryC::PrimaryAttack()
{
if(m_pPlayer->ammo_rockets <= 0)
{
PlayEmptySound();
return;
}
m_pPlayer->m_iWeaponVolume = 1000;
m_pPlayer->m_iWeaponFlash = 512;
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usFireIC, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, 0, 0, 0);
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
m_pPlayer->ammo_rockets--;
m_flTimeWeaponIdle = 1.2;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.2;
}

95
dlls/tfc/nailgun.cpp Normal file
View File

@ -0,0 +1,95 @@
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "gamerules.h"
LINK_ENTITY_TO_CLASS( tf_weapon_ng, CTFNailgun )
void CTFNailgun::Spawn()
{
Precache();
m_iId = 4;
m_iDefaultAmmo = 50;
pev->solid = SOLID_TRIGGER;
}
void CTFNailgun::Precache( void )
{
PRECACHE_MODEL("models/v_tfc_nailgun.mdl");
PRECACHE_MODEL("models/v_tfc_supernailgun.mdl");
PRECACHE_MODEL("models/p_nailgun.mdl");
PRECACHE_MODEL("models/p_nailgun2.mdl");
PRECACHE_MODEL("models/p_snailgun.mdl");
PRECACHE_MODEL("models/p_snailgun2.mdl");
PRECACHE_SOUND("items/9mmclip1.wav");
PRECACHE_SOUND("items/clipinsert1.wav");
PRECACHE_SOUND("items/cliprelease1.wav");
PRECACHE_SOUND("weapons/airgun_1.wav");
PRECACHE_SOUND("weapons/spike2.wav");
PRECACHE_SOUND("weapons/357_cock1.wav");
m_usFireNailGun = PRECACHE_EVENT(1, "events/wpn/tf_nail.sc");
}
int CTFNailgun::GetItemInfo( ItemInfo *p )
{
p->pszAmmo1 = "";
p->pszName = STRING( pev->classname );
p->iMaxAmmo1 = 200;
p->pszAmmo2 = 0;
p->iMaxAmmo2 = -1;
p->iSlot = 3;
p->iPosition = 4;
p->iFlags = 0;
p->iMaxClip = 0;
p->iId = 10;
p->iWeight = 15;
return 1;
}
BOOL CTFNailgun::Deploy()
{
return DefaultDeploy( "models/v_tfc_nailgun.mdl", "models/p_nailgun.mdl", NAILGUN_DEPLOY, "mp5", 1 );
}
void CTFNailgun::WeaponIdle( void )
{
if(m_flTimeWeaponIdle < 0.0)
{
m_flTimeWeaponIdle = 15;
SendWeaponAnim(NAILGUN_IDLE1, 1);
}
}
int CTFNailgun::AddToPlayer( CBasePlayer *pPlayer )
{
if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId );
MESSAGE_END();
return TRUE;
}
return FALSE;
}
void CTFNailgun::PrimaryAttack()
{
if(m_pPlayer->ammo_bolts <= 0)
{
PlayEmptySound();
return;
}
m_pPlayer->m_iWeaponVolume = 1000;
m_pPlayer->m_iWeaponFlash = 512;
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usFireNailGun, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, 0, 0, 0);
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
m_pPlayer->ammo_bolts--;
m_flTimeWeaponIdle = 10;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.1;
}

View File

@ -0,0 +1,62 @@
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "gamerules.h"
LINK_ENTITY_TO_CLASS( tf_weapon_pl, CTFPipebombLauncher )
void CTFPipebombLauncher::Spawn()
{
Precache();
SET_MODEL( ENT( pev ), "models/w_gauss.mdl" );
m_iId = 22;
m_iDefaultAmmo = 50;
m_fReloadTime = 0.666667;
pev->solid = SOLID_TRIGGER;
m_usFireGL = PRECACHE_EVENT(1, "events/wpn/tf_gl.sc");
}
int CTFPipebombLauncher::GetItemInfo( ItemInfo *p )
{
p->pszAmmo1 = "rockets";
p->pszName = STRING( pev->classname );
p->iMaxAmmo1 = 50;
p->pszAmmo2 = 0;
p->iMaxAmmo2 = -1;
p->iSlot = 4;
p->iPosition = 4;
p->iFlags = 0;
p->iMaxClip = 6;
p->iId = 22;
p->iWeight = 15;
return 1;
}
void CTFPipebombLauncher::PrimaryAttack()
{
if(m_pPlayer->ammo_rockets <= 0)
{
m_flNextPrimaryAttack = 1;
SendWeaponAnim(0, 1);
PlayEmptySound();
m_fInSpecialReload = 0;
//tfstate
return;
}
m_pPlayer->m_iWeaponVolume = 1000;
m_pPlayer->m_iWeaponFlash = 512;
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usFireGL, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, 0, 0, 0);
m_fInSpecialReload = 0;
//tfstate
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
m_iClip--;
m_flTimeWeaponIdle = 0.6;
m_flNextPrimaryAttack = 0.6;
m_flNextSecondaryAttack = 0.6;
}

82
dlls/tfc/railgun.cpp Normal file
View File

@ -0,0 +1,82 @@
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "gamerules.h"
LINK_ENTITY_TO_CLASS( tf_weapon_railgun, CTFRailgun )
void CTFRailgun::Spawn()
{
Precache();
//pev->classname = STRING("tf_weapon_railgun");
SET_MODEL( ENT( pev ), "models/w_gauss.mdl" );
m_iId = 21;
m_iDefaultAmmo = 17;
pev->solid = SOLID_TRIGGER;
}
int CTFRailgun::GetItemInfo( ItemInfo *p )
{
p->pszAmmo1 = "";
p->pszName = STRING( pev->classname );
p->iMaxAmmo1 = 50;
p->pszAmmo2 = 0;
p->iMaxAmmo2 = -1;
p->iSlot = 1;
p->iPosition = 2;
p->iFlags = 0;
p->iMaxClip = -1;
p->iId = 21;
p->iWeight = 10;
return 1;
}
void CTFRailgun::Precache()
{
PRECACHE_MODEL("models/v_tfc_railgun.mdl");
PRECACHE_MODEL("models/w_gauss.mdl");
PRECACHE_MODEL("models/p_9mmhandgun.mdl");
PRECACHE_MODEL("models/p_9mmhandgun2.mdl");
PRECACHE_SOUND("weapons/railgun.wav");
m_usFireRail = PRECACHE_EVENT(1, "events/wpn/tf_rail.sc");
}
BOOL CTFRailgun::Deploy()
{
return DefaultDeploy( "models/v_tfc_railgun.mdl", "models/p_9mmhandgun.mdl", 2, "onehanded", 1 );
}
void CTFRailgun::PrimaryAttack()
{
if(m_pPlayer->ammo_bolts <= 0)
{
PlayEmptySound();
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.2;
return;
}
m_pPlayer->m_iWeaponVolume = 600;
m_pPlayer->m_iWeaponFlash = 256;
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usFireRail, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, 0, 0, 0);
m_pPlayer->pev->effects |= EF_MUZZLEFLASH;
m_pPlayer->SetAnimation(PLAYER_ATTACK1);
m_pPlayer->ammo_bolts--;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.4;
m_flTimeWeaponIdle = 12.5;
}
void CTFRailgun::WeaponIdle( void )
{
ResetEmptySound();
if(m_flTimeWeaponIdle <= 0.0)
{
m_flTimeWeaponIdle = 12.5;
SendWeaponAnim(0, 1);
}
}

193
dlls/tfc/rpg.cpp Normal file
View File

@ -0,0 +1,193 @@
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "gamerules.h"
LINK_ENTITY_TO_CLASS( tf_weapon_rpg, CTFRpg )
void CTFRpg::Spawn()
{
Precache();
m_iId = 14;
SET_MODEL(ENT(pev), "models/w_rpg.mdl");
m_iDefaultAmmo = 50;
m_fReloadTime = 1.25;
pev->solid = SOLID_TRIGGER;
}
int CTFRpg::GetItemInfo( ItemInfo *p )
{
p->pszAmmo1 = "rockets";
p->pszName = STRING( pev->classname );
p->iMaxAmmo1 = 50;
p->pszAmmo2 = 0;
p->iMaxAmmo2 = -1;
p->iSlot = 4;
p->iPosition = 1;
p->iFlags = 0;
p->iMaxClip = 4;
p->iId = 14;
p->iWeight = 20;
return 1;
}
void CTFRpg::Holster()
{
//тф стейт чот там
m_fInSpecialReload = 0;
m_pPlayer->m_flNextAttack = 0.5;
}
void CTFRpg::Precache()
{
PRECACHE_MODEL("models/v_tfc_rpg.mdl");
PRECACHE_MODEL("models/p_srpg.mdl");
PRECACHE_MODEL("models/p_shotgun2.mdl");
PRECACHE_MODEL("models/p_rpg2.mdl");
PRECACHE_SOUND("weapons/9mmclip1.wav");
UTIL_PrecacheOther("tf_rpg_rocket");
PRECACHE_SOUND("weapons/rocketfire1.wav");
PRECACHE_SOUND("weapons/glauncher.wav");
m_usFireRPG = PRECACHE_EVENT(1, "events/wpn/tf_rpg.sc");
}
void CTFRpg::Reload( void )
{
if ( m_pPlayer->ammo_rockets == 0 || m_iClip == 4 || m_flNextReload > 0.0 || m_flNextPrimaryAttack > 0.0)
return;
if ( m_fInSpecialReload )
{
if ( m_fInSpecialReload == 1 )
{
if ( m_flTimeWeaponIdle <= gpGlobals->time )
{
m_fInSpecialReload = 2;
SendWeaponAnim(TFCRPG_RELCYCLE, 1);
m_flNextReload = UTIL_WeaponTimeBase() + m_fReloadTime;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + m_fReloadTime;
}
}
else
{
m_iClip += 1;
m_pPlayer->ammo_rockets -= 1;
m_fInSpecialReload = 1;
//m_pPlayer->tfstate &= 2;
}
}
else
{
SendWeaponAnim(TFCRPG_RELSTART, 1);
//m_pPlayer->tfstate |= 2;
m_fInSpecialReload = 1;
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.1;
m_flTimeWeaponIdle = 0.1;
m_flNextSecondaryAttack = 0.1;
m_flNextPrimaryAttack = 0.0;
}
}
void CTFRpg::WeaponIdle( void )
{
ResetEmptySound();
if (m_flTimeWeaponIdle > 0.0)
return;
if(m_iClip > 0)
{
if (!m_fInSpecialReload)
{
if (m_pPlayer->ammo_rockets > 0)
{
if(m_iClip == 0)
SendWeaponAnim(TFCRPG_FIDGET2, 1);
else
SendWeaponAnim(TFCRPG_IDLE, 1);
m_flTimeWeaponIdle = 3;
}
else
m_flTimeWeaponIdle = 1;
return;
}
if (m_iClip == 4)
{
SendWeaponAnim(TFCRPG_RELEND, 1);
m_fInSpecialReload = 0;
m_flTimeWeaponIdle = 1.5;
return;
}
}
else if (!m_fInSpecialReload)
{
if (m_pPlayer->ammo_rockets > 0)
{
Reload();
return;
}
if (m_pPlayer->ammo_rockets > 0)
{
if(m_iClip == 0)
SendWeaponAnim(TFCRPG_FIDGET2, 1);
else
SendWeaponAnim(TFCRPG_IDLE, 1);
m_flTimeWeaponIdle = 3;
}
else
m_flTimeWeaponIdle = 1;
return;
}
if (m_pPlayer->ammo_rockets > 0)
{
Reload();
return;
}
SendWeaponAnim(TFCRPG_RELEND, 1);
m_fInSpecialReload = 0;
m_flTimeWeaponIdle = 1.5;
return;
}
BOOL CTFRpg::Deploy()
{
if(m_iClip >= 0)
return DefaultDeploy( "models/v_tfc_rpg.mdl", "models/p_srpg.mdl", TFCRPG_DRAW1, "rpg", 1 );
else
return DefaultDeploy( "models/v_tfc_rpg.mdl", "models/p_srpg.mdl", TFCRPG_DRAW2, "rpg", 1 );
}
int CTFRpg::AddToPlayer( CBasePlayer *pPlayer )
{
if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId );
MESSAGE_END();
return TRUE;
}
return FALSE;
}
void CTFRpg::PrimaryAttack()
{
if(m_iClip <= 0)
return;
m_pPlayer->m_iWeaponVolume = 1000;
m_pPlayer->m_iWeaponFlash = 512;
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usFireRPG, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, 0, 0, 0);
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
m_fInSpecialReload = 0;
//tfstatatata
m_iClip--;
m_flTimeWeaponIdle = 0.8;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.8;
}

204
dlls/tfc/shotgun.cpp Normal file
View File

@ -0,0 +1,204 @@
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "gamerules.h"
LINK_ENTITY_TO_CLASS( tf_weapon_shotgun, CTFShotgun )
void CTFShotgun::Spawn()
{
Precache();
m_iId = 8;
m_iDefaultAmmo = 8;
m_iMaxClipSize = 8;
m_iShellsReloaded = 1;
m_fReloadTime = 0.25;
m_flPumpTime = 1000;
pev->solid = SOLID_TRIGGER;
}
void CTFShotgun::Precache( void )
{
PRECACHE_MODEL("models/v_tfc_12gauge.mdl");
PRECACHE_MODEL("models/p_smallshotgun.mdl");
PRECACHE_MODEL("models/p_shotgun2.mdl");
m_iShell = PRECACHE_MODEL("models/shotgunshell.mdl");
PRECACHE_SOUND("weapons/dbarrel1.wav");
PRECACHE_SOUND("weapons/sbarrel1.wav");
PRECACHE_SOUND("weapons/reload1.wav");
PRECACHE_SOUND("weapons/reload3.wav");
PRECACHE_SOUND("weapons/357_cock1.wav");
PRECACHE_SOUND("weapons/scock1.wav");
PRECACHE_SOUND("weapons/shotgn2.wav");
m_usFireShotgun = PRECACHE_EVENT(1, "events/wpn/tf_sg.sc");
m_usReloadShotgun = PRECACHE_EVENT(1, "events/wpn/tf_sgreload.sc");
m_usPumpShotgun = PRECACHE_EVENT(1, "events/wpn/tf_sgpump.sc");
}
int CTFShotgun::AddToPlayer( CBasePlayer *pPlayer )
{
if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId );
MESSAGE_END();
return TRUE;
}
return FALSE;
}
int CTFShotgun::GetItemInfo( ItemInfo *p )
{
p->pszAmmo1 = "buckshot";
p->pszName = STRING( pev->classname );
p->iMaxAmmo1 = 200;
p->pszAmmo2 = 0;
p->iMaxAmmo2 = -1;
p->iSlot = 1;
p->iPosition = 3;
p->iFlags = 0;
p->iMaxClip = m_iMaxClipSize;
p->iId = 8;
p->iWeight = 15;
return 1;
}
BOOL CTFShotgun::Deploy()
{
return DefaultDeploy( "models/v_tfc_12gauge.mdl", "models/p_smallshotgun.mdl", TFCSHOTGUN_DRAW, "shotgun", 1 );
}
void CTFShotgun::PrimaryAttack()
{
float flDelta;
vec3_t *p_vecDirShooting;
vec3_t vecSrc, vecAiming;
vec3_t spread;
if ( m_iClip <= 0 )
{
Reload();
if( m_iClip == 0 )
PlayEmptySound();
}
else
{
m_pPlayer->m_iWeaponVolume = 1000;
m_pPlayer->m_iWeaponFlash = 256;
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usFireShotgun, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, 0, 0, 0);
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
vecSrc = m_pPlayer->GetGunPosition();
vecAiming = m_pPlayer->GetAutoaimVector(AUTOAIM_5DEGREES);
spread.x = 0.04;
spread.y = 0.04;
spread.z = 0;
m_pPlayer->FireBullets(6, vecSrc, vecAiming, spread, 2048.0, 6, 0, 4, 0);
if ( !m_iClip && m_pPlayer->ammo_buckshot <= 0 )
{
p_vecDirShooting = 0;
flDelta = 0.0;
}
m_iClip--;
pev->effects |= EF_MUZZLEFLASH;
m_fInSpecialReload = 0;
m_flTimeWeaponIdle = 5;
//m_pPlayer->tfstate &= 2;
if ( m_iClip )
m_flPumpTime = 0.5;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5;
}
}
void CTFShotgun::Reload( void )
{
if ( m_pPlayer->ammo_buckshot >= m_iShellsReloaded )
{
if ( m_iClip != m_iMaxClipSize && m_flNextReload <= 0.0 && m_flNextPrimaryAttack <= 0.0 )
{
if (m_fInSpecialReload)
{
if ( m_fInSpecialReload == 1 )
{
if ( m_flTimeWeaponIdle <= 0.0 )
{
m_fInSpecialReload = 2;
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usReloadShotgun, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 0, 0, 0, 0);
m_flNextReload = m_fReloadTime;
m_flTimeWeaponIdle = m_fReloadTime;
}
}
else
{
m_iClip = m_iShellsReloaded + m_iClip;
m_pPlayer->ammo_buckshot -= m_iShellsReloaded;
m_fInSpecialReload = 1;
//m_pPlayer->tfstate &= 2;
}
}
else
{
SendWeaponAnim(TFCSHOTGUN_STARTRELOAD, 1);
//m_pPlayer->tfstate |= 2;
m_fInSpecialReload = 1;
m_pPlayer->m_flNextAttack = 0.1;
m_flTimeWeaponIdle = 0.1;
m_flNextSecondaryAttack = 0.1;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.1;
}
}
}
}
void CTFShotgun::WeaponIdle( void )
{
int iAnim;
ResetEmptySound();
if ( m_flPumpTime != 1000.0 && m_flPumpTime < 0.0 )
{
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usPumpShotgun, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 0, 0, 0, 0);
m_flPumpTime = 1000;
}
if (m_flTimeWeaponIdle < 0.0 )
{
if ( m_fInSpecialReload )
{
if ( m_iClip == m_iMaxClipSize || m_pPlayer->ammo_buckshot < m_iShellsReloaded )
{
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usPumpShotgun, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 0, 0, 1, 0);
m_fInSpecialReload = 0;
m_flTimeWeaponIdle = 1.5;
return;
}
Reload();
return;
}
int i = UTIL_SharedRandomLong(m_pPlayer->random_seed, 0, 20);
if ( i == 5 * (i / 5) )
{
if ( i == 20 * (i / 20) )
{
m_flTimeWeaponIdle = 2.22222;
iAnim = TFCSHOTGUN_IDLE;
}
else
{
m_flTimeWeaponIdle = 2.10526;
iAnim = TFCSHOTGUN_IDLE4;
}
}
else
{
m_flTimeWeaponIdle = 5;
iAnim = TFCSHOTGUN_DEEPIDLE;
}
SendWeaponAnim(iAnim, 1);
}
}

228
dlls/tfc/sniperrifle.cpp Normal file
View File

@ -0,0 +1,228 @@
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "gamerules.h"
LINK_ENTITY_TO_CLASS( laser_spot, CLaserSpot )
LINK_ENTITY_TO_CLASS( tf_weapon_sniperrifle, CTFSniperRifle )
CLaserSpot *CLaserSpot::CreateSpot( void )
{
CLaserSpot *pSpot = GetClassPtr( (CLaserSpot *)NULL );
pSpot->Spawn();
pSpot->pev->classname = MAKE_STRING( "laser_spot" );
return pSpot;
}
void CLaserSpot::Spawn( void )
{
Precache();
pev->movetype = MOVETYPE_NONE;
pev->solid = SOLID_NOT;
pev->rendermode = kRenderGlow;
pev->renderfx = kRenderFxNoDissipation;
pev->renderamt = 255;
SET_MODEL( ENT( pev ), "sprites/laserdot.spr" );
UTIL_SetOrigin( pev, pev->origin );
}
void CLaserSpot::Suspend( float flSuspendTime )
{
pev->effects |= EF_NODRAW;
SetThink( &CLaserSpot::Revive );
pev->nextthink = gpGlobals->time + flSuspendTime;
}
void CLaserSpot::Revive()
{
pev->effects &= ~EF_NODRAW;
SetThink( NULL );
}
void CLaserSpot::Precache()
{
PRECACHE_MODEL( "sprites/laserdot.spr" );
}
void CTFSniperRifle::Spawn()
{
Precache();
m_iId = 6;
m_iDefaultAmmo = 5;
m_fAimedDamage = 0;
m_fNextAimBonus = -1;
pev->solid = SOLID_TRIGGER;
}
void CTFSniperRifle::Precache()
{
PRECACHE_MODEL("models/v_tfc_sniper.mdl");
PRECACHE_MODEL("models/p_sniper.mdl");
PRECACHE_MODEL("models/p_sniper2.mdl");
PRECACHE_SOUND("ambience/rifle1.wav");
m_usFireSniper = PRECACHE_EVENT(1, "events/wpn/tf_sniper.sc");
m_usSniperHit = PRECACHE_EVENT(1, "events/wpn/tf_sniperhit.sc");
}
int CTFSniperRifle::GetItemInfo( ItemInfo *p )
{
p->pszAmmo1 = "buckshot";
p->pszName = STRING( pev->classname );
p->iMaxAmmo1 = 75;
p->pszAmmo2 = 0;
p->iMaxAmmo2 = -1;
p->iSlot = 1;
p->iPosition = 1;
p->iFlags = 0;
p->iMaxClip = -1;
p->iId = 6;
p->iWeight = 10;
return 1;
}
void CTFSniperRifle::SecondaryAttack()
{
if(m_fInZoom)
{
m_pPlayer->m_iFOV = 0;
pev->fov = 0;
m_fInZoom = 0;
}
else
{
m_pPlayer->m_iFOV = 20;
pev->fov = 20;
m_fInZoom = 1;
}
pev->nextthink = gpGlobals->time + 0.1;
m_flNextSecondaryAttack = 0.3;
}
void CTFSniperRifle::Holster()
{
m_fInReload = 0;
if(m_fInZoom)
SecondaryAttack();
//m_pPlayer->tfstate &= 2;
//тф сет спид
if(m_pSpot)
m_pSpot->Killed(0, 0);
m_fAimedDamage = 0;
m_pPlayer->m_flNextAttack = 0.5;
SendWeaponAnim(SNIPER_HOLSTER, 1);
}
BOOL CTFSniperRifle::Deploy()
{
m_pSpot = 0;
m_flTimeWeaponIdle = 0.5;
m_fAimedDamage = 0;
m_iSpotActive = 0;
//Velaron: "autosniper" draw animation
return DefaultDeploy( "models/v_tfc_sniper.mdl", "models/p_sniper.mdl", SNIPER_DRAW, "mp5", 1 );
}
int CTFSniperRifle::AddToPlayer( CBasePlayer *pPlayer )
{
if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId );
MESSAGE_END();
return TRUE;
}
return FALSE;
}
void CTFSniperRifle::UpdateSpot()
{
vec3_t vecSrc, vecEnd;
TraceResult tr;
if(!m_iSpotActive)
return;
if(!m_pSpot)
{
m_pSpot = CLaserSpot::CreateSpot();
//Velaron: effect 256
//m_pSpot->pev->effects |= 256;
m_pSpot->pev->owner = ENT(m_pPlayer->pev);
}
UTIL_MakeVectors(m_pPlayer->pev->v_angle);
vecSrc = m_pPlayer->GetGunPosition();
vecEnd.x = gpGlobals->v_forward.x * 8192.0 + vecSrc.x;
vecEnd.y = gpGlobals->v_forward.y * 8192.0 + vecSrc.y;
vecEnd.z = gpGlobals->v_forward.z * 8192.0 + vecSrc.z;
UTIL_TraceLine(vecSrc, vecEnd, dont_ignore_monsters, ENT(m_pPlayer->pev), &tr);
UTIL_SetOrigin(m_pSpot->pev, tr.vecEndPos);
m_pSpot->pev->renderamt = 0.25 * m_fAimedDamage + 150.0;
}
void CTFSniperRifle::WeaponIdle( void )
{
if(m_iSpotActive)
UpdateSpot();
if(m_flTimeWeaponIdle < 0.0)
{
m_flTimeWeaponIdle = 12.5;
SendWeaponAnim(SNIPER_IDLE, 1);
}
}
//Velaron: finish this nightmare
void CTFSniperRifle::PrimaryAttack()
{
vec3_t anglesAim;
vec3_t vecAim;
vec3_t vecSrc, vecEnd;
TraceResult tr;
if(m_pPlayer->ammo_buckshot <= 0)
{
PlayEmptySound();
return;
}
m_pPlayer->m_iWeaponVolume = 200;
m_pPlayer->m_iWeaponFlash = 512;
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usFireSniper, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, m_fAimedDamage, 0, 0, 0);
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
m_flTimeWeaponIdle = 0.5;
anglesAim.x = m_pPlayer->pev->v_angle.x + m_pPlayer->pev->punchangle.x;
anglesAim.y = m_pPlayer->pev->v_angle.y + m_pPlayer->pev->punchangle.y;
anglesAim.z = m_pPlayer->pev->v_angle.z + m_pPlayer->pev->punchangle.z;
UTIL_MakeVectors(anglesAim);
vecAim = m_pPlayer->GetGunPosition();
UTIL_TraceLine(vecSrc, vecEnd, dont_ignore_monsters, ENT(m_pPlayer->pev), &tr);
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usSniperHit, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, 0, 0, 0);
m_pPlayer->ammo_buckshot--;
}
void CTFSniperRifle::ItemPostFrame()
{
/*
if(!m_pPlayer->pev->button & 8 || m_flNextSecondaryAttack > 0.0)
{
if(m_pPlayer->m_afButtonReleased & 1 && m_flNextPrimaryAttack <= 0.0)
{
if(tfstate & 8)
{}
}
}
*/
}

68
dlls/tfc/spanner.cpp Normal file
View File

@ -0,0 +1,68 @@
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "gamerules.h"
LINK_ENTITY_TO_CLASS( tf_weapon_spanner, CTFSpanner )
void CTFSpanner::Spawn()
{
Precache();
m_iId = 4;
SET_MODEL(ENT(pev), "models/w_egon.mdl");
m_iDefaultAmmo = 50;
pev->solid = SOLID_TRIGGER;
classid = 1;
}
void CTFSpanner::Precache()
{
PRECACHE_MODEL("models/v_tfc_spanner.mdl");
PRECACHE_MODEL("models/p_spanner.mdl");
PRECACHE_MODEL("models/p_spanner2.mdl");
m_usAxe = PRECACHE_EVENT(1, "events/wpn/tf_axe.sc");
m_usAxeDecal = PRECACHE_EVENT(1, "events/wpn/tf_axedecal.sc");
}
void CTFSpanner::Holster()
{
SendWeaponAnim(5, 1);
m_pPlayer->m_flNextAttack = 0.5;
}
int CTFSpanner::GetItemInfo( ItemInfo *p )
{
p->pszAmmo1 = "uranium";
p->pszName = STRING( pev->classname );
p->iMaxAmmo1 = -1;
p->pszAmmo2 = 0;
p->iMaxAmmo2 = -1;
p->iSlot = 0;
p->iPosition = 2;
p->iFlags = 0;
p->iMaxClip = -1;
p->iId = 4;
p->iWeight = 0;
return 1;
}
BOOL CTFSpanner::Deploy()
{
return DefaultDeploy( "models/v_tfc_spanner.mdl", "models/p_spanner.mdl", 4, "crowbar", 1 );
}
void CTFSpanner::WeaponIdle( void )
{
ResetEmptySound();
if(m_flTimeWeaponIdle <= 0.0)
{
m_flTimeWeaponIdle = 12.5;
SendWeaponAnim(0, 1);
}
}

56
dlls/tfc/supernailgun.cpp Normal file
View File

@ -0,0 +1,56 @@
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "gamerules.h"
LINK_ENTITY_TO_CLASS( tf_weapon_superng, CTFSuperNailgun )
void CTFSuperNailgun::Precache()
{
CTFNailgun::Precache();
m_usFireSuperNailGun = PRECACHE_EVENT(1, "events/wpn/tf_snail.sc");
}
int CTFSuperNailgun::GetItemInfo( ItemInfo *p )
{
p->pszAmmo1 = "";
p->pszName = STRING( pev->classname );
p->iMaxAmmo1 = 150;
p->pszAmmo2 = 0;
p->iMaxAmmo2 = -1;
p->iSlot = 3;
p->iPosition = 1;
p->iFlags = 0;
p->iMaxClip = 0;
p->iId = 11;
p->iWeight = 15;
return 1;
}
BOOL CTFSuperNailgun::Deploy()
{
return DefaultDeploy( "models/v_tfc_supernailgun.mdl", "models/p_snailgun.mdl", NAILGUN_DEPLOY, "mp5", 1 );
}
void CTFSuperNailgun::PrimaryAttack()
{
if(m_pPlayer->ammo_bolts <= 0)
{
PlayEmptySound();
return;
}
m_pPlayer->m_iWeaponVolume = 1000;
m_pPlayer->m_iWeaponFlash = 512;
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usFireSuperNailGun, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, 0, 0, 0);
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
m_pPlayer->ammo_bolts -= 2;
if(m_pPlayer->ammo_bolts < 0)
m_pPlayer->ammo_bolts = 0;
m_flTimeWeaponIdle = 10;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.1;
}

109
dlls/tfc/supershotgun.cpp Normal file
View File

@ -0,0 +1,109 @@
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "gamerules.h"
LINK_ENTITY_TO_CLASS( tf_weapon_supershotgun, CTFSuperShotgun )
void CTFSuperShotgun::Spawn()
{
Precache();
m_iId = 9;
m_iDefaultAmmo = 16;
m_iMaxClipSize = 16;
m_iShellsReloaded = 2;
m_fReloadTime = 0.375;
m_flPumpTime = 1000;
pev->solid = SOLID_TRIGGER;
}
void CTFSuperShotgun::Precache( void )
{
PRECACHE_MODEL("models/v_tfc_shotgun.mdl");
PRECACHE_MODEL("models/p_shotgun.mdl");
PRECACHE_MODEL("models/p_shotgun2.mdl");
m_iShell = PRECACHE_MODEL("models/shotgunshell.mdl");
PRECACHE_SOUND("weapons/dbarrel1.wav");
PRECACHE_SOUND("weapons/sbarrel1.wav");
PRECACHE_SOUND("weapons/reload1.wav");
PRECACHE_SOUND("weapons/reload3.wav");
PRECACHE_SOUND("weapons/357_cock1.wav");
PRECACHE_SOUND("weapons/scock1.wav");
PRECACHE_SOUND("weapons/shotgn2.wav");
m_usFireSuperShotgun = PRECACHE_EVENT(1, "events/wpn/tf_ssg.sc");
m_usReloadShotgun = PRECACHE_EVENT(1, "events/wpn/tf_sgreload.sc");
m_usPumpShotgun = PRECACHE_EVENT(1, "events/wpn/tf_sgpump.sc");
}
int CTFSuperShotgun::GetItemInfo( ItemInfo *p )
{
p->pszAmmo1 = "buckshot";
p->pszName = STRING( pev->classname );
p->iMaxAmmo1 = 200;
p->pszAmmo2 = 0;
p->iMaxAmmo2 = -1;
p->iSlot = 2;
p->iPosition = 2;
p->iFlags = 0;
p->iMaxClip = m_iMaxClipSize;
p->iId = 9;
p->iWeight = 15;
return 1;
}
BOOL CTFSuperShotgun::Deploy()
{
return DefaultDeploy( "models/v_tfc_shotgun.mdl", "models/p_shotgun.mdl", 6, "shotgun", 1 );
}
void CTFSuperShotgun::PrimaryAttack()
{
float flDelta;
vec3_t *p_vecDirShooting;
vec3_t vecSrc, vecAiming;
vec3_t spread;
if ( m_iClip == 1 )
{
CTFShotgun::PrimaryAttack();
return;
}
if ( m_iClip <= 0 )
{
Reload();
if( m_iClip == 0 )
PlayEmptySound();
}
else
{
m_pPlayer->m_iWeaponVolume = 1000;
m_pPlayer->m_iWeaponFlash = 256;
PLAYBACK_EVENT_FULL(1, ENT(m_pPlayer->pev), m_usFireSuperShotgun, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, 0, 0, 0);
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
vecSrc = m_pPlayer->GetGunPosition();
vecAiming = m_pPlayer->GetAutoaimVector(AUTOAIM_5DEGREES);
spread.x = 0.04;
spread.y = 0.04;
spread.z = 0;
m_pPlayer->FireBullets(14, vecSrc, vecAiming, spread, 2048.0, 6, 4, 4, 0);
if ( !m_iClip && m_pPlayer->ammo_buckshot <= 0 )
{
p_vecDirShooting = 0;
flDelta = 0.0;
}
m_iClip -= 2;
pev->effects |= EF_MUZZLEFLASH;
m_fInSpecialReload = 0;
m_flTimeWeaponIdle = 5;
//m_pPlayer->tfstate &= 2;
if ( m_iClip )
m_flPumpTime = 0.7;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5;
}
}

File diff suppressed because it is too large Load Diff