mirror of https://github.com/FWGS/hlsdk-xash3d
Add TF sources
This commit is contained in:
parent
e0cf84da82
commit
cde2afff7c
|
@ -1,4 +1,4 @@
|
|||
# Binaries
|
||||
.vscode/
|
||||
*.o
|
||||
*.so
|
||||
*/*.o
|
||||
|
@ -17,3 +17,4 @@ cmake_install.cmake
|
|||
*.vsxproj
|
||||
*.vsproj
|
||||
*.sln
|
||||
*.cmd
|
|
@ -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
|
|
@ -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>
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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>
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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 |
|
@ -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() );
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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 );
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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();
|
||||
*/
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 )
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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
|
|
@ -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);
|
||||
}
|
|
@ -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];
|
|
@ -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 }
|
||||
};
|
||||
|
||||
|
|
|
@ -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--;
|
||||
}
|
|
@ -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 );
|
||||
}
|
|
@ -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--;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
{}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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
Loading…
Reference in New Issue