Difference between revisions of "Talk:Installing and Debugging the Source Code"

From Valve Developer Community
Jump to: navigation, search
(If it can't find files weapon_sdkbase.cpp and weapon_sdkbase.h: new section)
(Undo revision 163738 by TheBombOCat (talk))
Line 79: Line 79:
  
 
-[http://developer.valvesoftware.com/wiki/User:Midnightstar312 [midnightstar312]]
 
-[http://developer.valvesoftware.com/wiki/User:Midnightstar312 [midnightstar312]]
 
== If it can't find files weapon_sdkbase.cpp and weapon_sdkbase.h ==
 
 
Put it there
 
\src\game\shared\sdk\weapon_sdkbase.h
 
<code>
 
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
 
//
 
// Purpose:
 
//
 
//=============================================================================//
 
 
#ifndef WEAPON_SDKBASE_H
 
#define WEAPON_SDKBASE_H
 
#ifdef _WIN32
 
#pragma once
 
#endif
 
 
#include "sdk_playeranimstate.h"
 
#include "sdk_weapon_parse.h"
 
 
#if defined( CLIENT_DLL )
 
#define CWeaponSDKBase C_WeaponSDKBase
 
#endif
 
 
class CSDKPlayer;
 
 
// These are the names of the ammo types that the weapon script files reference.
 
class CWeaponSDKBase : public CBaseCombatWeapon
 
{
 
public:
 
DECLARE_CLASS( CWeaponSDKBase, CBaseCombatWeapon );
 
DECLARE_NETWORKCLASS();
 
DECLARE_PREDICTABLE();
 
 
CWeaponSDKBase();
 
 
#ifdef GAME_DLL
 
DECLARE_DATADESC();
 
#endif
 
#ifdef CLIENT_DLL
 
      virtual bool ShouldPredict();
 
#endif
 
// All predicted weapons need to implement and return true
 
virtual bool IsPredicted() const { return true; }
 
virtual SDKWeaponID GetWeaponID( void ) const { return WEAPON_NONE; }
 
 
// Get SDK weapon specific weapon data.
 
CSDKWeaponInfo const &GetSDKWpnData() const;
 
 
// Get a pointer to the player that owns this weapon
 
CSDKPlayer* GetPlayerOwner() const;
 
 
// override to play custom empty sounds
 
virtual bool PlayEmptySound();
 
 
//Tony; these five functions return the sequences the view model uses for a particular action. -- You can override any of these in a particular weapon if you want them to do
 
//something different, ie: when a pistol is out of ammo, it would show a different sequence.
 
virtual Activity GetPrimaryAttackActivity( void ) { return ACT_VM_PRIMARYATTACK; }
 
virtual Activity GetIdleActivity( void ) { return ACT_VM_IDLE; }
 
virtual Activity GetDeployActivity( void ) { return ACT_VM_DRAW; }
 
virtual Activity GetReloadActivity( void ) { return ACT_VM_RELOAD; }
 
virtual Activity GetHolsterActivity( void ) { return ACT_VM_HOLSTER; }
 
 
virtual void WeaponIdle( void );
 
virtual bool Reload( void );
 
virtual bool Deploy();
 
virtual bool Holster( CBaseCombatWeapon *pSwitchingTo );
 
virtual void SendReloadEvents();
 
 
//Tony; added so we can have base functionality without implementing it into every weapon.
 
virtual void ItemPostFrame();
 
virtual void PrimaryAttack();
 
virtual void SecondaryAttack();
 
 
//Tony; default weapon spread, pretty accurate - accuracy systems would need to modify this
 
virtual float GetWeaponSpread() { return 0.01f; }
 
 
//Tony; by default, all weapons are automatic.
 
//If you add code to switch firemodes, this function would need to be overridden to return the correct current mode.
 
virtual int GetFireMode() const { return FM_AUTOMATIC; }
 
 
virtual float GetFireRate( void ) { return GetSDKWpnData().m_flCycleTime; };
 
 
//Tony; by default, burst fire weapons use a max of 3 shots (3 - 1)
 
//weapons with more, ie: a 5 round burst, can override and determine which firemode it's in.
 
virtual int MaxBurstShots() const { return 2; }
 
 
float GetWeaponFOV()
 
{
 
return GetSDKWpnData().m_flWeaponFOV;
 
}
 
#ifdef GAME_DLL
 
void SetDieThink( bool bDie );
 
void Die( void );
 
void SetWeaponModelIndex( const char *pName )
 
{
 
m_iWorldModelIndex = modelinfo->GetModelIndex( pName );
 
}
 
#endif
 
 
virtual bool CanWeaponBeDropped() const { return true; }
 
private:
 
 
CNetworkVar(float, m_flDecreaseShotsFired);
 
 
CWeaponSDKBase( const CWeaponSDKBase & );
 
};
 
 
 
#endif // WEAPON_SDKBASE_H
 
</code>
 
 
and weapon_sdkbase.cpp
 
<code>
 
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
 
//
 
// Purpose:
 
//
 
// $NoKeywords: $
 
//=============================================================================//
 
 
#include "cbase.h"
 
#include "in_buttons.h"
 
#include "takedamageinfo.h"
 
#include "weapon_sdkbase.h"
 
#include "ammodef.h"
 
 
#include "sdk_fx_shared.h"
 
 
#if defined( CLIENT_DLL )
 
 
#include "c_sdk_player.h"
 
 
#else
 
 
#include "sdk_player.h"
 
 
#endif
 
 
// ----------------------------------------------------------------------------- //
 
// CWeaponSDKBase tables.
 
// ----------------------------------------------------------------------------- //
 
 
IMPLEMENT_NETWORKCLASS_ALIASED( WeaponSDKBase, DT_WeaponSDKBase )
 
 
BEGIN_NETWORK_TABLE( CWeaponSDKBase, DT_WeaponSDKBase )
 
#ifdef CLIENT_DLL
 
  RecvPropFloat( RECVINFO( m_flDecreaseShotsFired ) ),
 
#else
 
SendPropExclude( "DT_BaseAnimating", "m_nNewSequenceParity" ),
 
SendPropExclude( "DT_BaseAnimating", "m_nResetEventsParity" ),
 
SendPropFloat( SENDINFO( m_flDecreaseShotsFired ) ),
 
#endif
 
END_NETWORK_TABLE()
 
 
#ifdef CLIENT_DLL
 
BEGIN_PREDICTION_DATA( CWeaponSDKBase )
 
DEFINE_PRED_FIELD( m_flTimeWeaponIdle, FIELD_FLOAT, FTYPEDESC_OVERRIDE | FTYPEDESC_NOERRORCHECK ),
 
END_PREDICTION_DATA()
 
#endif
 
 
LINK_ENTITY_TO_CLASS( weapon_sdk_base, CWeaponSDKBase );
 
 
 
#ifdef GAME_DLL
 
 
BEGIN_DATADESC( CWeaponSDKBase )
 
 
// New weapon Think and Touch Functions go here..
 
 
END_DATADESC()
 
 
#endif
 
 
#ifdef CLIENT_DLL
 
bool CWeaponSDKBase::ShouldPredict()
 
{
 
      if ( GetOwner() && GetOwner() == C_BasePlayer::GetLocalPlayer())
 
              return true;
 
 
      return BaseClass::ShouldPredict();
 
}
 
#endif
 
// ----------------------------------------------------------------------------- //
 
// CWeaponCSBase implementation.
 
// ----------------------------------------------------------------------------- //
 
CWeaponSDKBase::CWeaponSDKBase()
 
{
 
SetPredictionEligible( true );
 
 
AddSolidFlags( FSOLID_TRIGGER ); // Nothing collides with these but it gets touches.
 
}
 
 
const CSDKWeaponInfo &CWeaponSDKBase::GetSDKWpnData() const
 
{
 
const FileWeaponInfo_t *pWeaponInfo = &GetWpnData();
 
const CSDKWeaponInfo *pSDKInfo;
 
 
#ifdef _DEBUG
 
pSDKInfo = dynamic_cast< const CSDKWeaponInfo* >( pWeaponInfo );
 
Assert( pSDKInfo );
 
#else
 
pSDKInfo = static_cast< const CSDKWeaponInfo* >( pWeaponInfo );
 
#endif
 
 
return *pSDKInfo;
 
}
 
 
bool CWeaponSDKBase::PlayEmptySound()
 
{
 
CPASAttenuationFilter filter( this );
 
filter.UsePredictionRules();
 
 
EmitSound( filter, entindex(), "Default.ClipEmpty_Rifle" );
 
 
return 0;
 
}
 
 
CSDKPlayer* CWeaponSDKBase::GetPlayerOwner() const
 
{
 
return dynamic_cast< CSDKPlayer* >( GetOwner() );
 
}
 
 
#ifdef CLIENT_DLL
 
void UTIL_ClipPunchAngleOffset( QAngle &in, const QAngle &punch, const QAngle &clip )
 
{
 
QAngle final = in + punch;
 
 
//Clip each component
 
for ( int i = 0; i < 3; i++ )
 
{
 
if ( final[i] > clip[i] )
 
{
 
final[i] = clip[i];
 
}
 
else if ( final[i] < -clip[i] )
 
{
 
final[i] = -clip[i];
 
}
 
 
//Return the result
 
in[i] = final[i] - punch[i];
 
}
 
}
 
#endif
 
 
//Tony; added as a default primary attack if it doesn't get overridden, ie: by CSDKWeaponMelee
 
void CWeaponSDKBase::PrimaryAttack( void )
 
{
 
// If my clip is empty (and I use clips) start reload
 
if ( UsesClipsForAmmo1() && !m_iClip1 )
 
{
 
Reload();
 
return;
 
}
 
 
CSDKPlayer *pPlayer = GetPlayerOwner();
 
 
if (!pPlayer)
 
return;
 
 
//Tony; check firemodes --
 
switch(GetFireMode())
 
{
 
case FM_SEMIAUTOMATIC:
 
if (pPlayer->GetShotsFired() > 0)
 
return;
 
break;
 
//Tony; added an accessor to determine the max burst on a per-weapon basis.
 
case FM_BURST:
 
if (pPlayer->GetShotsFired() > MaxBurstShots())
 
return;
 
break;
 
}
 
#ifdef GAME_DLL
 
pPlayer->NoteWeaponFired();
 
#endif
 
 
pPlayer->DoMuzzleFlash();
 
 
SendWeaponAnim( GetPrimaryAttackActivity() );
 
 
// Make sure we don't fire more than the amount in the clip
 
if ( UsesClipsForAmmo1() )
 
m_iClip1 --;
 
else
 
pPlayer->RemoveAmmo(1, m_iPrimaryAmmoType );
 
 
pPlayer->IncreaseShotsFired();
 
 
float flSpread = GetWeaponSpread();
 
 
FX_FireBullets(
 
pPlayer->entindex(),
 
pPlayer->Weapon_ShootPosition(),
 
pPlayer->EyeAngles() + pPlayer->GetPunchAngle(),
 
GetWeaponID(),
 
0, //Tony; fire mode - this is unused at the moment, left over from CSS when SDK* was created in the first place.
 
CBaseEntity::GetPredictionRandomSeed() & 255,
 
flSpread
 
);
 
 
 
//Add our view kick in
 
AddViewKick();
 
 
//Tony; update our weapon idle time
 
SetWeaponIdleTime( gpGlobals->curtime + SequenceDuration() );
 
 
m_flNextPrimaryAttack = gpGlobals->curtime + GetFireRate();
 
m_flNextSecondaryAttack = gpGlobals->curtime + SequenceDuration();
 
}
 
 
void CWeaponSDKBase::SecondaryAttack()
 
{
 
}
 
 
//Tony; added so we can have base functionality without implementing it into every weapon.
 
void CWeaponSDKBase::ItemPostFrame( void )
 
{
 
CSDKPlayer *pPlayer = GetPlayerOwner();
 
if ( !pPlayer )
 
return;
 
 
//
 
//Tony; totally override the baseclass
 
//
 
 
if ( UsesClipsForAmmo1() )
 
CheckReload();
 
 
bool bFired = false;
 
 
// Secondary attack has priority
 
if ((pPlayer->m_nButtons & IN_ATTACK2) && (m_flNextSecondaryAttack <= gpGlobals->curtime) && pPlayer->CanAttack())
 
{
 
if (UsesSecondaryAmmo() && pPlayer->GetAmmoCount(m_iSecondaryAmmoType)<=0 )
 
{
 
if (m_flNextEmptySoundTime < gpGlobals->curtime)
 
{
 
WeaponSound(EMPTY);
 
m_flNextSecondaryAttack = m_flNextEmptySoundTime = gpGlobals->curtime + 0.5;
 
}
 
}
 
else if (pPlayer->GetWaterLevel() == 3 && m_bAltFiresUnderwater == false)
 
{
 
// This weapon doesn't fire underwater
 
WeaponSound(EMPTY);
 
m_flNextPrimaryAttack = gpGlobals->curtime + 0.2;
 
}
 
else
 
{
 
bFired = true;
 
SecondaryAttack();
 
 
// Secondary ammo doesn't have a reload animation
 
if ( UsesClipsForAmmo2() )
 
{
 
// reload clip2 if empty
 
if (m_iClip2 < 1)
 
{
 
pPlayer->RemoveAmmo( 1, m_iSecondaryAmmoType );
 
m_iClip2 = m_iClip2 + 1;
 
}
 
}
 
}
 
}
 
 
if ( !bFired && (pPlayer->m_nButtons & IN_ATTACK) && (m_flNextPrimaryAttack <= gpGlobals->curtime) && pPlayer->CanAttack())
 
{
 
// Clip empty? Or out of ammo on a no-clip weapon?
 
if ( !IsMeleeWeapon() && (( UsesClipsForAmmo1() && m_iClip1 <= 0) || ( !UsesClipsForAmmo1() && pPlayer->GetAmmoCount(m_iPrimaryAmmoType)<=0 )) )
 
{
 
HandleFireOnEmpty();
 
}
 
else if (pPlayer->GetWaterLevel() == 3 && m_bFiresUnderwater == false)
 
{
 
// This weapon doesn't fire underwater
 
WeaponSound(EMPTY);
 
m_flNextPrimaryAttack = gpGlobals->curtime + 0.2;
 
}
 
else
 
{
 
PrimaryAttack();
 
}
 
}
 
 
// -----------------------
 
//  Reload pressed / Clip Empty
 
// -----------------------
 
if ( pPlayer->m_nButtons & IN_RELOAD && UsesClipsForAmmo1() && !m_bInReload)
 
{
 
// reload when reload is pressed, or if no buttons are down and weapon is empty.
 
Reload();
 
}
 
 
// -----------------------
 
//  No buttons down
 
// -----------------------
 
if (!((pPlayer->m_nButtons & IN_ATTACK) || (pPlayer->m_nButtons & IN_ATTACK2) || (pPlayer->m_nButtons & IN_RELOAD)))
 
{
 
// no fire buttons down or reloading
 
if ( !ReloadOrSwitchWeapons() && ( m_bInReload == false ) )
 
{
 
WeaponIdle();
 
}
 
}
 
 
// Tony; decrease shots fired count - tweak the time as necessary.
 
if ( !( pPlayer->m_nButtons & IN_ATTACK ) )
 
{
 
//Tony; check firemodes -- If we're semi or burst, we will clear shots fired now that the player has let go of the button.
 
switch(GetFireMode())
 
{
 
case FM_SEMIAUTOMATIC:
 
if (pPlayer->GetShotsFired() > 0)
 
pPlayer->ClearShotsFired();
 
break;
 
//Tony; TODO; add an accessor to determine the max burst on a per-weapon basis!!
 
//DONE!
 
case FM_BURST:
 
if (pPlayer->GetShotsFired() > MaxBurstShots())
 
pPlayer->ClearShotsFired();
 
break;
 
}
 
 
m_bFireOnEmpty = false;
 
if ( (pPlayer->GetShotsFired() > 0) && (m_flDecreaseShotsFired < gpGlobals->curtime) )
 
{
 
m_flDecreaseShotsFired = gpGlobals->curtime + 0.05495;
 
pPlayer->DecreaseShotsFired();
 
}
 
}
 
}
 
 
void CWeaponSDKBase::WeaponIdle( void )
 
{
 
//Idle again if we've finished
 
if ( HasWeaponIdleTimeElapsed() )
 
{
 
SendWeaponAnim( GetIdleActivity() );
 
SetWeaponIdleTime( gpGlobals->curtime + SequenceDuration() );
 
}
 
}
 
bool CWeaponSDKBase::Reload( void )
 
{
 
bool fRet;
 
float fCacheTime = m_flNextSecondaryAttack;
 
 
fRet = DefaultReload( GetMaxClip1(), GetMaxClip2(), GetReloadActivity() );
 
if ( fRet )
 
{
 
 
SendReloadEvents();
 
 
// Undo whatever the reload process has done to our secondary
 
// attack timer. We allow you to interrupt reloading to fire
 
// a grenade.
 
m_flNextSecondaryAttack = GetOwner()->m_flNextAttack = fCacheTime;
 
 
WeaponSound( RELOAD );
 
if (GetPlayerOwner())
 
GetPlayerOwner()->ClearShotsFired();
 
}
 
 
return fRet;
 
}
 
void CWeaponSDKBase::SendReloadEvents()
 
{
 
CSDKPlayer *pPlayer = GetPlayerOwner();
 
if ( !pPlayer )
 
return;
 
 
#ifdef GAME_DLL
 
// Send a message to any clients that have this entity to play the reload.
 
CPASFilter filter( pPlayer->GetAbsOrigin() );
 
filter.RemoveRecipient( pPlayer );
 
 
UserMessageBegin( filter, "ReloadEffect" );
 
WRITE_SHORT( pPlayer->entindex() );
 
MessageEnd();
 
#endif
 
// Make the player play his reload animation.
 
pPlayer->DoAnimationEvent( PLAYERANIMEVENT_RELOAD );
 
}
 
//-----------------------------------------------------------------------------
 
// Purpose:
 
//-----------------------------------------------------------------------------
 
bool CWeaponSDKBase::Deploy( )
 
{
 
MDLCACHE_CRITICAL_SECTION();
 
 
//Tony; on deploy clear shots fired.
 
if (GetPlayerOwner())
 
GetPlayerOwner()->ClearShotsFired();
 
 
return DefaultDeploy( (char*)GetViewModel(), (char*)GetWorldModel(), GetDeployActivity(), (char*)GetAnimPrefix() );
 
}
 
 
//-----------------------------------------------------------------------------
 
// Purpose:
 
//-----------------------------------------------------------------------------
 
//Tony; use the same name as the base context one.
 
#define SDK_HIDEWEAPON_THINK_CONTEXT "BaseCombatWeapon_HideThink"
 
bool CWeaponSDKBase::Holster( CBaseCombatWeapon *pSwitchingTo )
 
{
 
MDLCACHE_CRITICAL_SECTION();
 
 
// cancel any reload in progress.
 
m_bInReload = false;
 
 
// kill any think functions
 
SetThink(NULL);
 
 
// Some weapon's don't have holster anims yet, so detect that
 
float flSequenceDuration = 0;
 
SendWeaponAnim( GetHolsterActivity() );
 
{
 
flSequenceDuration = SequenceDuration();
 
}
 
 
CBaseCombatCharacter *pOwner = GetOwner();
 
if (pOwner)
 
{
 
pOwner->SetNextAttack( gpGlobals->curtime + flSequenceDuration );
 
}
 
 
// If we don't have a holster anim, hide immediately to avoid timing issues
 
if ( !flSequenceDuration )
 
{
 
SetWeaponVisible( false );
 
}
 
else
 
{
 
// Hide the weapon when the holster animation's finished
 
SetContextThink( &CBaseCombatWeapon::HideThink, gpGlobals->curtime + flSequenceDuration, SDK_HIDEWEAPON_THINK_CONTEXT );
 
}
 
 
return true;
 
}
 
 
#ifdef GAME_DLL
 
void CWeaponSDKBase::SetDieThink( bool bDie )
 
{
 
if( bDie )
 
SetContextThink( &CWeaponSDKBase::Die, gpGlobals->curtime + 45.0f, "DieContext" );
 
else
 
SetContextThink( NULL, gpGlobals->curtime, "DieContext" );
 
}
 
void CWeaponSDKBase::Die( void )
 
{
 
UTIL_Remove( this );
 
}
 
#endif
 
</code>
 
—[[User:TheBombOCat|TheBombOCat]] 01:39, 2 January 2012 (PST)
 

Revision as of 09:40, 2 January 2012

I am currently trying to find a way to build the SDK from the free Microsoft Visual C++ 2003 toolkit. Any help/contributions from you or Valve would be most appreciated. [Big Ev]

You should stop while you're ahead. Look for Microsoft Visual Studio .NET 2003 on eBay ;-) --wisemx 09:34, 13 Aug 2005 (PDT)
Not a bad idea Mark, I'll check out eBay. Also great HL2 tutorials page in your profile.[Big Ev]
Check out this. it should come with the full standard edition too -ts2do

I just installed the SDK for the first time, and tried to compile a new project just to make sure that everything worked. Of course, it didn't. :) client.dll compiled fine, but there were three link errors in the project for server.dll:

hl2mp_client.obj : error LNK2019: unresolved external symbol "void __cdecl Bot_RunAll(void)" (?Bot_RunAll@@YAXXZ) referenced in function "void __cdecl GameStartFrame(void)" (?GameStartFrame@@YAXXZ)

hl2mp_gamerules.obj : error LNK2019: unresolved external symbol "class CBasePlayer * __cdecl BotPutInServer(bool,int)" (?BotPutInServer@@YAPAVCBasePlayer@@_NH@Z) referenced in function "void __cdecl Bot_f(void)" (?Bot_f@@YAXXZ)

Debug_hl2mp/server.dll : fatal error LNK1120: 2 unresolved externals

The third error is pretty easy to understand. I was able to find the two function definitions for the first two errors, and noticed that the offending code for both was inside #ifdef DEBUG statements. Is the SDK not supposed to compile in debug mode, and only in release? Or is there something else that I missed? --ATimson 16:40, 17 Sep 2005 (PDT)

Yes, having a decent grasp of C++ and your compiler. --^Ben
Ok, sure I'm not an expert but I'm trying to learn. A little more help than pointing out my shortcomings will be appreciated. I have the same problem as ATimson. Please help. --curVV

filesystem_steam.dll causing crash

I had a problem starting a debug session when I went through this tutorial. I got an Unresolved Exception in filesystem_steam.dll. After some time, I figured out that you need to add "" to the path that follows the -game command argument, if the path contains spaces. In my case i had to set my command argument to -dev -sw -game "C:\Games\Valve\Steam\SteamApps\SourceMods\My Mod"

Hope this can help someone...

Debugging with multiple GCF's?

I find that I'm unable to debug unless I comment out all of my MountSteamContent's. It produces an error like Appid is 320 something something.

Once commented out it works fine but with obvious missing content.

Garry what up!!! lol—ts2do (talk) 12:39, 15 Oct 2005 (PDT)

Applying Debugging Options

One thing i have noticed here, if you do not see your hl2.exe in the specified working directory, you must simply run the game type you are trying to mod. So in teh case of the tutorial, just run HL2 after installing the SDK and your ready.

Fresh installation, fresh errors

Im using a copy of Visual Studio 2005, freshly installed, nothing changed or edited. I just used the "Create a Mod" wizard and hit "Rebuild Solution" on the game_sdk.sln. Nothing compiles and i get tonnes of errors and even more warnings. On both Debug and Release configurations. What am i doing wrong?[Kyle (SneakyNinja)]

Maybe nothing. The SDK was created with an earlier version of Visual Studio. It's not at all unusual for things to break in this situation. I haven't tried it on VS2005 yet, and can't get to it this week, either, but hopefully someone else can. —Maven (talk) 15:48, 6 Dec 2005 (PST)
You did nothing wrong, currently, the source code does not compile with VS 2005. Valve has said they are working on fixing that but currently it's incompatible. [dleidlein]
Here is the updated information for VS 2005.

link VS2005 --Irish 10:54, 2 Mar 2007 (PST)

Debugging Issues

09.11.06 I have followed these directions for running in the debugger and have been unsuccessful. I have built a HL2MP mod (no errors, code is unchanged from the extract) and cannot run in the debugger. Upon entering in the command parameters and running the debugger, I recieve a popup in VS2003:

Unhandled exception at 0x0d101edf in hl2.exe: 0xC0000005: Access violation reading location 0x00000000. Unsigned comment added by Reacheround (talkcontribs). Please use four tildes (~~~~) to sign your username.

Try running the game (single player HL2 of HL2DM) then running your mod, sometimes that works. --Daktor 07:21, 9 Nov 2006 (PST)
I was able to rebuild all with 5 warnings, but when I run it, the New Game button takes me to a blank "New Game" screen where the "Start New Game" button does nothing. Should I chalk this up to a VS 2005 issue, still? --Nebrekker 17:59, 16 Jan 2007 (PST)

The instructions reference things that aren't there, I get errors, but . . . it works?

Compile the Source Code "Navigate to the directory where you installed the source code. In our example, it would be C:\MyMod\Src. Open the game_sdk.sln file." I didn't see a game_sdk.sln file. Rather, I saw
Everything_SDK-2003.sln
Everything_SDK-2005.sln
Game_HL2-2003.sln
Game_HL2-2005.sln
I choose Game_HL2-2005.sln. At the end of the process, I did indeed have two new dll's in the other folder. Then the Note, "Note: It seems that as of the August 2006 SourceSDK update, using the parameters specified above can lead to a “No Entry Point Found” error when trying to run the game from Visual Studio to debug the code. Use the parameters listed below:" Isn't this what a wiki is all about? If the parameters change, edit the parameters to be correct. The previous version is always there in the History of the article if anyone needs to look at it. Anyway, the note said to enter the Command line as C:\Steam\SteamApps\Username\source sdk base\hl2.exe But there is no "source sdk base" folder under my Username folder, just the hl2.exe file. So I ignored the note. Then, when I tried to run an instance, it failed, giving me some error message that told me that Steam had to be open. So I opened Steam and it failed again. So I opened the Source SDK and then tried to run an instance. This time it gave me some errors, "The procedure entry point CommandLine_Tier0 could not be located in the dynamic link library tier0.dll." It gave that error twice. Then it said: "The procedure entry point Q_NormalizeUTF8 could not be located in the dynamic link library vstdlib_s.dll." Then it gave the first error two more times. But then it actually started the game. So, it seems to work, but there are some miscrepencies and errors in the process somewhere. Banaticus -- BAH 01:19, 22 Mar 2007 (PDT)

"Create a Mod" tool crashes

In this tutorial, when I get to the part "Run the Create a Mod wizard", "Click the Next button ...", the installer crashes after copying most of the files and I get a request to send an error report from my system. I have run the procedure several times and every time it appears to crash when trying to copy the file, hl2_Spanish.txt.--HLUser 09:32, 8 Apr 2007 (PDT)

Refresh your SDK Content. Validate your Caches are good. Reinstall Hl2. Etc. --Sortie 01:51, 9 Apr 2007 (PDT)

Call me crazy...

Call me crazy, but shouldn't this section be updated if it's out of date??

If you can't find the Source SDK Base 2007

Try running the Source SDK Base at least once in Steam. After the run, it should show up in it's proper location (C:\Program Files\Steam\steamapps\USERNAME\source sdk base 2007).

-[midnightstar312]