first commit

This commit is contained in:
murdle
2026-03-01 02:38:58 +02:00
commit 19250b9db4
19111 changed files with 4358159 additions and 0 deletions

View File

@@ -0,0 +1,171 @@
<root>
<data name="IDS_NULL">
<value>Not Used</value>
</data>
<data name="IDS_OK">
<value>OK</value>
</data>
<data name="IDS_BACK">
<value>Back</value>
</data>
<data name="IDS_CANCEL">
<value>Cancel</value>
</data>
<data name="IDS_YES">
<value>Yes</value>
</data>
<data name="IDS_NO">
<value>No</value>
</data>
<data name="IDS_CORRUPTSAVE_TITLE">
<value>Corrupt Save</value>
</data>
<data name="IDS_CORRUPTSAVE_TEXT">
<value>Your save data appears to be corrupt. Create a new save and overwrite the corrupt one?</value>
</data>
<data name="IDS_NOFREESPACE_TITLE">
<value>No Free Space</value>
</data>
<data name="IDS_NOFREESPACE_TEXT">
<value>Your selected storage device doesn't have enough free space to create a game save.</value>
</data>
<data name="IDS_SELECTAGAIN">
<value>Select again</value>
</data>
<data name="IDS_PLAYWITHOUTSAVING">
<value>Play without saving</value>
</data>
<data name="IDS_CREATEANEWSAVE">
<value>Create a new save</value>
</data>
<data name="IDS_OVERWRITESAVE_TITLE">
<value>Overwrite save?</value>
</data>
<data name="IDS_OVERWRITESAVE_TEXT">
<value>Your selected storage device already contains this save. Is it OK to overwrite it?</value>
</data>
<data name="IDS_OVERWRITESAVE_NO">
<value>No - don't overwrite</value>
</data>
<data name="IDS_OVERWRITESAVE_YES">
<value>Overwrite and save</value>
</data>
<data name="IDS_FAILED_TO_SAVE_TITLE">
<value>Save failed</value>
</data>
<data name="IDS_STORAGEDEVICEPROBLEM_TITLE">
<value>Storage Device Problem</value>
</data>
<data name="IDS_FAILED_TO_SAVE_TEXT">
<value>Your storage device is unavailable or has an error</value>
</data>
<data name="IDS_FAILED_TO_LOADSAVE_TEXT">
<value>Your storage device is unavailable or has an error. Please select a new storage device.</value>
</data>
<data name="IDS_SELECTANEWDEVICE">
<value>Select a new storage device</value>
</data>
<data name="IDS_NODEVICE_TITLE">
<value>No storage device selected</value>
</data>
<data name="IDS_NODEVICE_TEXT">
<value>If you do not select a storage device, game saves will be disabled</value>
</data>
<data name="IDS_NODEVICE_ACCEPT">
<value>Select a storage device</value>
</data>
<data name="IDS_NODEVICE_DECLINE">
<value>Continue without saving</value>
</data>
<data name="IDS_DEVICEGONE_TEXT">
<value>Your storage device has been removed. Please select a new one.</value>
</data>
<data name="IDS_DEVICEGONE_TITLE">
<value>Loading failed</value>
</data>
<data name="IDS_KEYBOARDUI_SAVEGAME_TITLE">
<value>Name the save</value>
</data>
<data name="IDS_KEYBOARDUI_SAVEGAME_TEXT">
<value>Enter a name for your savegame</value>
</data>
<data name="IDS_WARNING_ARCADE_TITLE">
<value>Return to Xbox Dashboard</value>
</data>
<data name="IDS_WARNING_ARCADE_TEXT">
<value>Are you sure you want to exit the game?</value>
</data>
<data name="IDS_PRO_RETURNEDTOMENU_TITLE">
<value>Signed out</value>
</data>
<data name="IDS_PRO_RETURNEDTOTITLESCREEN_TEXT">
<value>You have been returned to the title screen because your gamer profile was signed out</value>
</data>
<data name="IDS_PRO_RETURNEDTOMENU_TEXT">
<value>The match has ended because a gamer profile was signed out</value>
</data>
<data name="IDS_PRO_RETURNEDTOMENU_ACCEPT">
<value>Continue playing</value>
</data>
<data name="IDS_PRO_NOTONLINE_TITLE">
<value>Gamer profile not online</value>
</data>
<data name="IDS_PRO_NOTONLINE_TEXT">
<value>This game has some features which require an Xbox LIVE enabled gamer profile, but you are currently offline.</value>
</data>
<data name="IDS_PRO_XBOXLIVE_NOTIFICATION">
<value>This feature requires a gamer profile which is signed into Xbox LIVE.</value>
</data>
<data name="IDS_PRO_NOTONLINE_ACCEPT">
<value>Connect to Xbox LIVE</value>
</data>
<data name="IDS_PRO_NOTONLINE_DECLINE">
<value>Continue playing offline</value>
</data>
<data name="IDS_PRO_ACHIEVEMENTPROBLEM_TITLE">
<value>Achievement Award Problem</value>
</data>
<data name="IDS_PRO_ACHIEVEMENTPROBLEM_TEXT">
<value> There was a problem accessing your gamer profile. Your achievement could not be awarded at this time.</value>
</data>
<data name="IDS_PRO_NOPROFILE_TITLE">
<value>Gamer profile problem</value>
</data>
<data name="IDS_PRO_NOPROFILEOPTIONS_TEXT">
<value>Saving of settings to gamer profile has failed.</value>
</data>
<data name="IDS_PRO_GUESTPROFILE_TITLE">
<value>Guest Gamer Profile</value>
</data>
<data name="IDS_PRO_GUESTPROFILE_TEXT">
<value>Guest gamer profile cannot access this feature. Please use a different gamer profile.</value>
</data>
<data name="IDS_STO_SAVING_SHORT">
<value>Saving…</value>
</data>
<data name="IDS_STO_SAVING_LONG">
<value>Saving content. Please don't turn off your console.</value>
</data>
<data name="IDS_PRO_UNLOCKGAME_TITLE">
<value>Unlock Full Game</value>
</data>
<data name="IDS_PRO_UNLOCKGAME_TEXT">
<value>This is the Minecraft trial game. If you had the full game, you would just have earned an achievement!
Unlock the full game to experience the joy of Minecraft and to play with your friends across the globe through Xbox LIVE.
Would you like to unlock the full game?</value>
</data>
<data name="IDS_PRO_PROFILEPROBLEM_TEXT">
<value>You are being returned to the main menu because of a problem reading your profile.</value>
</data>
</root>

View File

@@ -0,0 +1,127 @@
#pragma once
#define MAP_STYLE_0 0
#define MAP_STYLE_1 1
#define MAP_STYLE_2 2
#define _360_JOY_BUTTON_A 0x00000001
#define _360_JOY_BUTTON_B 0x00000002
#define _360_JOY_BUTTON_X 0x00000004
#define _360_JOY_BUTTON_Y 0x00000008
#define _360_JOY_BUTTON_START 0x00000010
#define _360_JOY_BUTTON_BACK 0x00000020
#define _360_JOY_BUTTON_RB 0x00000040
#define _360_JOY_BUTTON_LB 0x00000080
#define _360_JOY_BUTTON_RTHUMB 0x00000100
#define _360_JOY_BUTTON_LTHUMB 0x00000200
#define _360_JOY_BUTTON_DPAD_UP 0x00000400
#define _360_JOY_BUTTON_DPAD_DOWN 0x00000800
#define _360_JOY_BUTTON_DPAD_LEFT 0x00001000
#define _360_JOY_BUTTON_DPAD_RIGHT 0x00002000
// fake digital versions of analog values
#define _360_JOY_BUTTON_LSTICK_RIGHT 0x00004000
#define _360_JOY_BUTTON_LSTICK_LEFT 0x00008000
#define _360_JOY_BUTTON_RSTICK_DOWN 0x00010000
#define _360_JOY_BUTTON_RSTICK_UP 0x00020000
#define _360_JOY_BUTTON_RSTICK_RIGHT 0x00040000
#define _360_JOY_BUTTON_RSTICK_LEFT 0x00080000
#define _360_JOY_BUTTON_LSTICK_DOWN 0x00100000
#define _360_JOY_BUTTON_LSTICK_UP 0x00200000
#define _360_JOY_BUTTON_RT 0x00400000
#define _360_JOY_BUTTON_LT 0x00800000
// Stick axis maps - to allow changes for SouthPaw in-game axis mapping
#define AXIS_MAP_LX 0
#define AXIS_MAP_LY 1
#define AXIS_MAP_RX 2
#define AXIS_MAP_RY 3
// Trigger map - to allow for swap triggers in-game
#define TRIGGER_MAP_0 0
#define TRIGGER_MAP_1 1
class C_4JInput
{
public:
enum EKeyboardResult
{
EKeyboard_Pending,
EKeyboard_Cancelled,
EKeyboard_ResultAccept,
EKeyboard_ResultDecline,
};
enum EKeyboardMode
{
EKeyboardMode_Default,
EKeyboardMode_Numeric,
EKeyboardMode_Password,
EKeyboardMode_Alphabet,
EKeyboardMode_Full,
EKeyboardMode_Alphabet_Extended,
EKeyboardMode_IP_Address,
EKeyboardMode_Phone
};
void Initialise( int iInputStateC, unsigned char ucMapC,unsigned char ucActionC, unsigned char ucMenuActionC );
void Tick(void);
void SetDeadzoneAndMovementRange(unsigned int uiDeadzone, unsigned int uiMovementRangeMax );
void SetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction,unsigned int uiActionVal);
unsigned int GetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction);
void SetJoypadMapVal(int iPad,unsigned char ucMap);
unsigned char GetJoypadMapVal(int iPad);
void SetJoypadSensitivity(int iPad, float fSensitivity);
unsigned int GetValue(int iPad,unsigned char ucAction, bool bRepeat=false);
bool ButtonPressed(int iPad,unsigned char ucAction=255); // toggled
bool ButtonReleased(int iPad,unsigned char ucAction); //toggled
bool ButtonDown(int iPad,unsigned char ucAction=255); // button held down
// Functions to remap the axis and triggers for in-game (not menus) - SouthPaw, etc
void SetJoypadStickAxisMap(int iPad,unsigned int uiFrom, unsigned int uiTo);
void SetJoypadStickTriggerMap(int iPad,unsigned int uiFrom, unsigned int uiTo);
void SetKeyRepeatRate(float fRepeatDelaySecs,float fRepeatRateSecs);
void SetDebugSequence( const char *chSequenceA,int( *Func)(LPVOID),LPVOID lpParam );
FLOAT GetIdleSeconds(int iPad);
bool IsPadConnected(int iPad);
// In-Game values which may have been remapped due to Southpaw, swap triggers, etc
float GetJoypadStick_LX(int iPad, bool bCheckMenuDisplay=true);
float GetJoypadStick_LY(int iPad, bool bCheckMenuDisplay=true);
float GetJoypadStick_RX(int iPad, bool bCheckMenuDisplay=true);
float GetJoypadStick_RY(int iPad, bool bCheckMenuDisplay=true);
unsigned char GetJoypadLTrigger(int iPad, bool bCheckMenuDisplay=true);
unsigned char GetJoypadRTrigger(int iPad, bool bCheckMenuDisplay=true);
void SetMenuDisplayed(int iPad, bool bVal);
EKeyboardResult RequestKeyboard(UINT uiTitle, UINT uiText, UINT uiDesc, DWORD dwPad, WCHAR *pwchResult, UINT uiResultSize,int( *Func)(LPVOID,const bool),LPVOID lpParam,EKeyboardMode eMode,CXuiStringTable *pStringTable=NULL);
EKeyboardResult RequestKeyboard(UINT uiTitle, LPCWSTR pwchDefault, UINT uiDesc, DWORD dwPad, WCHAR *pwchResult, UINT uiResultSize,int( *Func)(LPVOID,const bool),LPVOID lpParam, EKeyboardMode eMode,CXuiStringTable *pStringTable=NULL);
// Online check strings against offensive list - TCR 92
// TCR # 092 CMTV Player Text String Verification
// Requirement Any player-entered text visible to another player on Xbox LIVE must be verified using the Xbox LIVE service before being transmitted. Text that is rejected by the Xbox LIVE service must not be displayed.
//
// Remarks
// This requirement applies to any player-entered string that can be exposed to other players on Xbox LIVE. It includes session names, content descriptions, text messages, tags, team names, mottos, comments, and so on.
//
// Games may decide to not send the text, blank it out, or use generic text if the text was rejected by the Xbox LIVE service.
//
// Games verify the text by calling the XStringVerify function.
//
// Exemption It is not required to use the Xbox LIVE service to verify real-time text communication. An example of real-time text communication is in-game text chat.
//
// Intent Protect players from inappropriate language.
/*
bool VerifyStrings(WCHAR **pwStringA,int iStringC,int( *Func)(LPVOID,STRING_VERIFY_RESPONSE *),LPVOID lpParam);
void CancelQueuedVerifyStrings(int( *Func)(LPVOID,STRING_VERIFY_RESPONSE *),LPVOID lpParam);
void CancelAllVerifyInProgress(void);
*/
//bool InputDetected(DWORD dwUserIndex,WCHAR *pwchInput);
};
// Singleton
extern C_4JInput InputManager;

View File

@@ -0,0 +1,124 @@
#pragma once
enum eAwardType
{
eAwardType_Achievement = 0,
eAwardType_GamerPic,
eAwardType_Theme,
eAwardType_AvatarItem,
};
enum eUpsellType
{
eUpsellType_Custom = 0, // This is the default, and means that the upsell dialog was initiated in the app code
eUpsellType_Achievement,
eUpsellType_GamerPic,
eUpsellType_Theme,
eUpsellType_AvatarItem,
};
enum eUpsellResponse
{
eUpsellResponse_Declined,
eUpsellResponse_Accepted_NoPurchase,
eUpsellResponse_Accepted_Purchase,
};
class C_4JProfile
{
public:
struct PROFILESETTINGS
{
int iYAxisInversion;
int iControllerSensitivity;
int iVibration;
bool bSwapSticks;
};
// 4 players have game defined data, puiGameDefinedDataChangedBitmask needs to be checked by the game side to see if there's an update needed - it'll have the bits set for players to be updated
void Initialise( DWORD dwTitleID,
DWORD dwOfferID,
unsigned short usProfileVersion,
UINT uiProfileValuesC,
UINT uiProfileSettingsC,
DWORD *pdwProfileSettingsA,
int iGameDefinedDataSizeX4,
unsigned int *puiGameDefinedDataChangedBitmask);
void SetTrialTextStringTable(CXuiStringTable *pStringTable,int iAccept,int iReject);
void SetTrialAwardText(eAwardType AwardType,int iTitle,int iText); // achievement popup in the trial game
int GetLockedProfile();
void SetLockedProfile(int iProf);
bool IsSignedIn(int iQuadrant);
bool IsSignedInLive(int iProf);
bool IsGuest(int iQuadrant);
UINT RequestSignInUI(bool bFromInvite,bool bLocalGame,bool bNoGuestsAllowed,bool bMultiplayerSignIn,bool bAddUser, int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY);
UINT DisplayOfflineProfile(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY);
UINT RequestConvertOfflineToGuestUI(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY);
void SetPrimaryPlayerChanged(bool bVal);
bool QuerySigninStatus(void);
void GetXUID(int iPad, XUID *pXuid,bool bOnlineXuid);
BOOL AreXUIDSEqual(XUID xuid1,XUID xuid2);
BOOL XUIDIsGuest(XUID xuid);
bool AllowedToPlayMultiplayer(int iProf);
void StartTrialGame(); // disables saves and leaderboard, and change state to readyforgame from pregame
void AllowedPlayerCreatedContent(int iPad, bool thisQuadrantOnly, BOOL *allAllowed, BOOL *friendsAllowed);
BOOL CanViewPlayerCreatedContent(int iPad, bool thisQuadrantOnly, PXUID pXuids, DWORD dwXuidCount );
// SYS
int GetPrimaryPad();
void SetPrimaryPad(int iPad);
char* GetGamertag(int iPad);
wchar_t* GetDisplayName(int iPad);
bool IsFullVersion();
void SetSignInChangeCallback(void ( *Func)(LPVOID, bool, unsigned int),LPVOID lpParam);
void SetNotificationsCallback(void ( *Func)(LPVOID, DWORD, unsigned int),LPVOID lpParam);
bool RegionIsNorthAmerica(void);
bool LocaleIsUSorCanada(void);
HRESULT GetLiveConnectionStatus();
bool IsSystemUIDisplayed();
void SetProfileReadErrorCallback(void ( *Func)(LPVOID), LPVOID lpParam);
// PROFILE DATA
int SetDefaultOptionsCallback(int( *Func)(LPVOID,PROFILESETTINGS *, const int iPad),LPVOID lpParam);
int SetOldProfileVersionCallback(int( *Func)(LPVOID,unsigned char *, const unsigned short,const int),LPVOID lpParam);
PROFILESETTINGS * GetDashboardProfileSettings(int iPad);
void WriteToProfile(int iQuadrant, bool bGameDefinedDataChanged=false, bool bOverride5MinuteLimitOnProfileWrites=false);
void ForceQueuedProfileWrites(int iPad=XUSER_INDEX_ANY);
void *GetGameDefinedProfileData(int iQuadrant);
void ResetProfileProcessState(); // after a sign out from the primary player, call this
void Tick( void );
// ACHIEVEMENTS & AWARDS
void RegisterAward(int iAwardNumber,int iGamerconfigID, eAwardType eType, bool bLeaderboardAffected=false,
CXuiStringTable*pStringTable=NULL, int iTitleStr=-1, int iTextStr=-1, int iAcceptStr=-1, char *pszThemeName=NULL, unsigned int uiThemeSize=0L);
int GetAwardId(int iAwardNumber);
eAwardType GetAwardType(int iAwardNumber);
bool CanBeAwarded(int iQuadrant, int iAwardNumber);
void Award(int iQuadrant, int iAwardNumber, bool bForce=false);
bool IsAwardsFlagSet(int iQuadrant, int iAward);
// RICH PRESENCE
void RichPresenceInit(int iPresenceCount, int iContextCount);
void RegisterRichPresenceContext(int iGameConfigContextID);
void SetRichPresenceContextValue(int iPad,int iContextID, int iVal);
void SetCurrentGameActivity(int iPad,int iNewPresence, bool bSetOthersToIdle=false);
// PURCHASE
void DisplayFullVersionPurchase(bool bRequired, int iQuadrant, int iUpsellParam = -1);
void SetUpsellCallback(void ( *Func)(LPVOID lpParam, eUpsellType type, eUpsellResponse response, int iUserData),LPVOID lpParam);
// Debug
void SetDebugFullOverride(bool bVal); // To override the license version (trail/full). Only in debug/release, not ContentPackage
};
// Singleton
extern C_4JProfile ProfileManager;

View File

@@ -0,0 +1,238 @@
#pragma once
#include <xsocialpost.h>
const int GL_MODELVIEW_MATRIX = 0;
const int GL_PROJECTION_MATRIX = 1;
const int GL_MODELVIEW = 0;
const int GL_PROJECTION = 1;
const int GL_TEXTURE = 2;
// These things required for tex gen
const int GL_S = 0;
const int GL_T = 1;
const int GL_R = 2;
const int GL_Q = 3;
const int GL_TEXTURE_GEN_S = 0;
const int GL_TEXTURE_GEN_T = 1;
const int GL_TEXTURE_GEN_Q = 2;
const int GL_TEXTURE_GEN_R = 3;
const int GL_TEXTURE_GEN_MODE = 0;
const int GL_OBJECT_LINEAR = 0;
const int GL_EYE_LINEAR = 1;
const int GL_OBJECT_PLANE = 0;
const int GL_EYE_PLANE = 1;
// These things are used by glEnable/glDisable so must be different and non-zero (zero is used by things we haven't assigned yet)
const int GL_TEXTURE_2D = 1;
const int GL_BLEND = 2;
const int GL_CULL_FACE = 3;
const int GL_ALPHA_TEST = 4;
const int GL_DEPTH_TEST = 5;
const int GL_FOG = 6;
const int GL_LIGHTING = 7;
const int GL_LIGHT0 = 8;
const int GL_LIGHT1 = 9;
const int GL_DEPTH_BUFFER_BIT = D3DCLEAR_ZBUFFER;
const int GL_COLOR_BUFFER_BIT = D3DCLEAR_TARGET;
const int GL_QUADS = D3DPT_QUADLIST;
const int GL_TRIANGLES = D3DPT_TRIANGLELIST;
const int GL_LINE_STRIP = D3DPT_LINESTRIP;
const int GL_TRIANGLE_STRIP = D3DPT_TRIANGLESTRIP;
const int GL_TRIANGLE_FAN = D3DPT_TRIANGLEFAN;
const int GL_LINES=D3DPT_LINELIST;
const int GL_SRC_ALPHA = D3DBLEND_SRCALPHA;
const int GL_ONE_MINUS_SRC_ALPHA = D3DBLEND_INVSRCALPHA;
const int GL_ONE = D3DBLEND_ONE;
const int GL_ZERO = D3DBLEND_ZERO;
const int GL_DST_ALPHA = D3DBLEND_DESTALPHA;
const int GL_SRC_COLOR = D3DBLEND_SRCCOLOR;
const int GL_DST_COLOR = D3DBLEND_DESTCOLOR;
const int GL_ONE_MINUS_DST_COLOR = D3DBLEND_INVDESTCOLOR;
const int GL_ONE_MINUS_SRC_COLOR = D3DBLEND_INVSRCCOLOR;
const int GL_CONSTANT_ALPHA = D3DBLEND_CONSTANTALPHA;
const int GL_ONE_MINUS_CONSTANT_ALPHA = D3DBLEND_INVCONSTANTALPHA;
const int GL_GREATER = D3DCMP_GREATER;
const int GL_EQUAL = D3DCMP_EQUAL;
const int GL_LEQUAL = D3DCMP_LESSEQUAL;
const int GL_GEQUAL = D3DCMP_GREATEREQUAL;
const int GL_ALWAYS = D3DCMP_ALWAYS;
const int GL_TEXTURE_MIN_FILTER = 1;
const int GL_TEXTURE_MAG_FILTER = 2;
const int GL_TEXTURE_WRAP_S = 3;
const int GL_TEXTURE_WRAP_T = 4;
const int GL_NEAREST = 0;
const int GL_LINEAR = 1;
const int GL_EXP = 2;
const int GL_NEAREST_MIPMAP_LINEAR = 0; // TODO - mipmapping bit of this
const int GL_CLAMP = 0;
const int GL_REPEAT = 1;
const int GL_FOG_START = 1;
const int GL_FOG_END = 2;
const int GL_FOG_MODE = 3;
const int GL_FOG_DENSITY = 4;
const int GL_FOG_COLOR = 5;
const int GL_POSITION = 1;
const int GL_AMBIENT = 2;
const int GL_DIFFUSE = 3;
const int GL_SPECULAR = 4;
const int GL_LIGHT_MODEL_AMBIENT = 1;
class C4JRender
{
public:
void Tick();
void UpdateGamma(unsigned short usGamma);
// Matrix stack
void MatrixMode(int type);
void MatrixSetIdentity();
void MatrixTranslate(float x,float y,float z);
void MatrixRotate(float angle, float x, float y, float z);
void MatrixScale(float x, float y, float z);
void MatrixPerspective(float fovy, float aspect, float zNear, float zFar);
void MatrixOrthogonal(float left,float right,float bottom,float top,float zNear,float zFar);
void MatrixPop();
void MatrixPush();
void MatrixMult(float *mat);
const float *MatrixGet(int type);
void Set_matrixDirty();
// Core
void Initialise(IDirect3DDevice9 *pDevice);
void InitialiseContext();
void Present();
void Clear(int flags, D3DRECT *pRect = NULL);
void SetClearColour(D3DCOLOR colour);
bool IsWidescreen();
bool IsHiDef();
void CaptureThumbnail(LPD3DXBUFFER *pngOut);
void CaptureScreen(LPD3DXBUFFER *jpgOut, XSOCIAL_PREVIEWIMAGE *previewOut);
void BeginConditionalSurvey(int identifier);
void EndConditionalSurvey();
void BeginConditionalRendering(int identifier);
void EndConditionalRendering();
// Vertex data handling
typedef enum
{
VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1, // Position 3 x float, texture 2 x float, colour 4 x byte, normal 4 x byte, padding 1 DWORD
VERTEX_TYPE_PS3_TS2_CS1, // Position 3 x short, texture 2 x short, colour 4 x byte, padding 1 DWORD
VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1_LIT, // as VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1 with lighting applied,
VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1_TEXGEN, // as VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1 with tex gen
VERTEX_TYPE_COUNT
} eVertexType;
// Pixel shader
typedef enum
{
PIXEL_SHADER_TYPE_STANDARD,
PIXEL_SHADER_TYPE_PROJECTION,
PIXEL_SHADER_TYPE_LOD_FORCE,
PIXEL_SHADER_COUNT
} ePixelShaderType;
typedef enum
{
VIEWPORT_TYPE_FULLSCREEN,
VIEWPORT_TYPE_SPLIT_TOP,
VIEWPORT_TYPE_SPLIT_BOTTOM,
VIEWPORT_TYPE_SPLIT_LEFT,
VIEWPORT_TYPE_SPLIT_RIGHT,
VIEWPORT_TYPE_QUADRANT_TOP_LEFT,
VIEWPORT_TYPE_QUADRANT_TOP_RIGHT,
VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT,
VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT,
} eViewportType;
void DrawVertices(D3DPRIMITIVETYPE PrimitiveType, int count, void *dataIn, eVertexType vType, C4JRender::ePixelShaderType psType);
void DrawVertexBuffer(D3DPRIMITIVETYPE PrimitiveType, int count, IDirect3DVertexBuffer9 *buffer, C4JRender::eVertexType vType, C4JRender::ePixelShaderType psType);
// Command buffers
void CBuffLockStaticCreations();
int CBuffCreate(int count);
void CBuffDelete(int first, int count);
void CBuffStart(int index);
void CBuffClear(int index);
int CBuffSize(int index);
void CBuffEnd(int vertexCount);
bool CBuffCall(int index, bool full = true);
void CBuffTick();
void CBuffDeferredModeStart();
void CBuffDeferredModeEnd();
typedef enum
{
TEXTURE_FORMAT_RxGyBzAw, // Normal 32-bit RGBA texture, 8 bits per component
TEXTURE_FORMAT_R0G0B0Ax, // One 8-bit component mapped to alpha channel, R=G=B=0
TEXTURE_FORMAT_R1G1B1Ax, // One 8-bit component mapped to alpha channel, R=G=B=1
TEXTURE_FORMAT_RxGxBxAx, // One 8-bit component mapped to all channels
MAX_TEXTURE_FORMATS
} eTextureFormat;
// Textures
int TextureCreate();
void TextureFree(int idx);
void TextureBind(int idx);
void TextureBindVertex(int idx);
void TextureSetTextureLevels(int levels);
int TextureGetTextureLevels();
void TextureData(int width, int height, void *data, int level, eTextureFormat format = TEXTURE_FORMAT_RxGyBzAw);
void TextureDataUpdate(void *data, int level);
void TextureSetParam(int param, int value);
HRESULT LoadTextureData(const char *szFilename,D3DXIMAGE_INFO *pSrcInfo, int **ppDataOut);
HRESULT LoadTextureData(BYTE *pbData, DWORD dwBytes,D3DXIMAGE_INFO *pSrcInfo, int **ppDataOut);
HRESULT SaveTextureData(const char *szFilename, D3DXIMAGE_INFO *pSrcInfo, int *ppDataOut);
void TextureGetStats();
// State control
void StateSetColour(float r, float g, float b, float a);
void StateSetDepthMask(bool enable);
void StateSetBlendEnable(bool enable);
void StateSetBlendFunc(int src, int dst);
void StateSetBlendFactor(unsigned int colour);
void StateSetAlphaFunc(int func, float param);
void StateSetDepthFunc(int func);
void StateSetFaceCull(bool enable);
void StateSetFaceCullCW(bool cw);
void StateSetLineWidth(float width);
void StateSetWriteEnable(bool red, bool green, bool blue, bool alpha);
void StateSetDepthTestEnable(bool enable);
void StateSetAlphaTestEnable(bool enable);
void StateSetDepthSlopeAndBias(float slope, float bias);
void StateSetFogEnable(bool enable);
void StateSetFogMode(int mode);
void StateSetFogNearDistance(float dist);
void StateSetFogFarDistance(float dist);
void StateSetFogDensity(float density);
void StateSetFogColour(float red, float green, float blue);
void StateSetLightingEnable(bool enable);
void StateSetVertexTextureUV( float u, float v);
void StateSetLightColour(int light, float red, float green, float blue);
void StateSetLightAmbientColour(float red, float green, float blue);
void StateSetLightDirection(int light, float x, float y, float z);
void StateSetLightEnable(int light, bool enable);
void StateSetViewport(eViewportType viewportType);
void StateSetEnableViewportClipPlanes(bool enable);
void StateSetTexGenCol(int col, float x, float y, float z, float w, bool eyeSpace);
void StateSetForceLOD(int LOD);
};
// Singleton
extern C4JRender RenderManager;

View File

@@ -0,0 +1,306 @@
#pragma once
using namespace std;
#include <vector>
class CXuiStringTable;
typedef struct
{
FILETIME fTime;
XCONTENT_DATA Content;
bool bSaveIsDamaged;
}
SAVE_DETAILS,*PSAVE_DETAILS;
typedef
VOID
(CALLBACK * TMSCLIENT_PROG_CALLBACK)(
__in float progress,
__in_opt void* userCallbackData
);
//typedef std::vector <PXMARKETPLACE_CONTENTOFFER_INFO> OfferDataArray;
typedef std::vector <PXMARKETPLACE_CURRENCY_CONTENTOFFER_INFO> OfferDataArray;
typedef std::vector <PXCONTENT_DATA> XContentDataArray;
//typedef std::vector <PSAVE_DETAILS> SaveDetailsArray;
// Current version of the dlc data creator
#define CURRENT_DLC_VERSION_NUM 3
class C4JStorage
{
public:
// Structs defined in the DLC_Creator, but added here to be used in the app
typedef struct
{
unsigned int uiFileSize;
DWORD dwType;
DWORD dwWchCount; // count of WCHAR in next array
WCHAR wchFile[1];
}
DLC_FILE_DETAILS, *PDLC_FILE_DETAILS;
typedef struct
{
DWORD dwType;
DWORD dwWchCount; // count of WCHAR in next array;
WCHAR wchData[1]; // will be an array of size dwBytes
}
DLC_FILE_PARAM, *PDLC_FILE_PARAM;
// End of DLC_Creator structs
typedef struct
{
WCHAR wchDisplayName[XCONTENT_MAX_DISPLAYNAME_LENGTH];
CHAR szFileName[XCONTENT_MAX_FILENAME_LENGTH];
DWORD dwImageOffset;
DWORD dwImageBytes;
}
CACHEINFOSTRUCT;
// structure to hold DLC info in TMS
typedef struct
{
DWORD dwVersion;
DWORD dwNewOffers;
DWORD dwTotalOffers;
DWORD dwInstalledTotalOffers;
BYTE bPadding[1024-sizeof(DWORD)*4]; // future expansion
}
DLC_TMS_DETAILS;
enum eGTS_FileTypes
{
eGTS_Type_Skin=0,
eGTS_Type_Cape,
eGTS_Type_MAX
};
enum eGlobalStorage
{
//eGlobalStorage_GameClip=0,
eGlobalStorage_Title=0,
eGlobalStorage_TitleUser,
eGlobalStorage_Max
};
enum EMessageResult
{
EMessage_Undefined=0,
EMessage_Busy,
EMessage_Pending,
EMessage_Cancelled,
EMessage_ResultAccept,
EMessage_ResultDecline,
EMessage_ResultThirdOption,
EMessage_ResultFourthOption
};
enum ESaveGameControlState
{
ESaveGameControl_Idle=0,
ESaveGameControl_Save,
ESaveGameControl_InternalRequestingDevice,
ESaveGameControl_InternalGetSaveName,
ESaveGameControl_InternalSaving,
ESaveGameControl_CopySave,
ESaveGameControl_CopyingSave,
};
enum ELoadGameStatus
{
ELoadGame_Idle=0,
ELoadGame_InProgress,
ELoadGame_NoSaves,
ELoadGame_ChangedDevice,
ELoadGame_DeviceRemoved
};
enum EDeleteGameStatus
{
EDeleteGame_Idle=0,
EDeleteGame_InProgress,
};
enum ESGIStatus
{
ESGIStatus_Error=0,
ESGIStatus_Idle,
ESGIStatus_ReadInProgress,
ESGIStatus_NoSaves,
};
enum EDLCStatus
{
EDLC_Error=0,
EDLC_Idle,
EDLC_NoOffers,
EDLC_AlreadyEnumeratedAllOffers,
EDLC_NoInstalledDLC,
EDLC_Pending,
EDLC_LoadInProgress,
EDLC_Loaded,
EDLC_ChangedDevice
};
enum ESavingMessage
{
ESavingMessage_None=0,
ESavingMessage_Short,
ESavingMessage_Long
};
enum ETMSStatus
{
ETMSStatus_Idle=0,
ETMSStatus_Fail,
ETMSStatus_ReadInProgress,
ETMSStatus_ReadFileListInProgress,
ETMSStatus_WriteInProgress,
ETMSStatus_Fail_ReadInProgress,
ETMSStatus_Fail_ReadFileListInProgress,
ETMSStatus_Fail_ReadDetailsNotRetrieved,
ETMSStatus_Fail_WriteInProgress,
ETMSStatus_DeleteInProgress,
ETMSStatus_Pending,
};
enum eTMS_FileType
{
eTMS_FileType_Normal=0,
eTMS_FileType_Graphic,
};
enum eTMS_FILETYPEVAL
{
TMS_FILETYPE_BINARY=0,
TMS_FILETYPE_CONFIG=1,
TMS_FILETYPE_JSON=2,
TMS_FILETYPE_MAX,
};
enum eTMS_UGCTYPE
{
TMS_UGCTYPE_NONE,
TMS_UGCTYPE_IMAGE,
TMS_UGCTYPE_MAX
};
typedef struct
{
CHAR szFilename[256];
int iFileSize;
eTMS_FILETYPEVAL eFileTypeVal;
}
TMSPP_FILE_DETAILS, *PTMSPP_FILE_DETAILS;
typedef struct
{
int iCount;
PTMSPP_FILE_DETAILS FileDetailsA;
}
TMSPP_FILE_LIST, *PTMSPP_FILE_LIST;
typedef struct
{
DWORD dwSize;
PBYTE pbData;
}
TMSPP_FILEDATA, *PTMSPP_FILEDATA;
C4JStorage();
void Tick(void);
// Messages
C4JStorage::EMessageResult RequestMessageBox(UINT uiTitle, UINT uiText, UINT *uiOptionA,UINT uiOptionC, DWORD dwPad=XUSER_INDEX_ANY,
int( *Func)(LPVOID,int,const C4JStorage::EMessageResult)=NULL,LPVOID lpParam=NULL, CXuiStringTable *pStringTable=NULL, WCHAR *pwchFormatString=NULL,DWORD dwFocusButton=0);
void CancelMessageBoxRequest();
C4JStorage::EMessageResult GetMessageBoxResult();
// save device
bool SetSaveDevice(int( *Func)(LPVOID,const bool),LPVOID lpParam, bool bForceResetOfSaveDevice=false);
// savegame
void Init(LPCWSTR pwchDefaultSaveName,char *pszSavePackName,int iMinimumSaveSize, int( *Func)(LPVOID, const ESavingMessage, int),LPVOID lpParam,LPCSTR szGroupID);
void ResetSaveData(); // Call before a new save to clear out stored save file name
void SetDefaultSaveNameForKeyboardDisplay(LPCWSTR pwchDefaultSaveName);
void SetSaveTitle(LPCWSTR pwchDefaultSaveName);
LPCWSTR GetSaveTitle();
bool GetSaveUniqueNumber(INT *piVal);
bool GetSaveUniqueFilename(char *pszName);
void SetState(ESaveGameControlState eControlState,int( *Func)(LPVOID,const bool),LPVOID lpParam);
void SetSaveDisabled(bool bDisable);
bool GetSaveDisabled(void);
unsigned int GetSaveSize();
void GetSaveData(void *pvData,unsigned int *puiBytes);
PVOID AllocateSaveData(unsigned int uiBytes);
void SaveSaveData(unsigned int uiBytes,PBYTE pbThumbnail=NULL,DWORD cbThumbnail=0,PBYTE pbTextData=NULL, DWORD dwTextLen=0);
void CopySaveDataToNewSave(PBYTE pbThumbnail,DWORD cbThumbnail,WCHAR *wchNewName,int ( *Func)(LPVOID lpParam, bool), LPVOID lpParam);
void SetSaveDeviceSelected(unsigned int uiPad,bool bSelected);
bool GetSaveDeviceSelected(unsigned int iPad);
C4JStorage::ELoadGameStatus DoesSaveExist(bool *pbExists);
bool EnoughSpaceForAMinSaveGame();
void SetSaveMessageVPosition(float fY); // The 'Saving' message will display at a default position unless changed
// Get the info for the saves
C4JStorage::ESGIStatus GetSavesInfo(int iPad,bool ( *Func)(LPVOID, int, CACHEINFOSTRUCT *, int, HRESULT),LPVOID lpParam,char *pszSavePackName);
void GetSaveCacheFileInfo(DWORD dwFile,XCONTENT_DATA &xContentData);
void GetSaveCacheFileInfo(DWORD dwFile, PBYTE *ppbImageData, DWORD *pdwImageBytes);
// Load the save. Need to call GetSaveData once the callback is called
C4JStorage::ELoadGameStatus LoadSaveData(XCONTENT_DATA *pContentData,int( *Func)(LPVOID lpParam,const bool), LPVOID lpParam);
C4JStorage::EDeleteGameStatus DeleteSaveData(XCONTENT_DATA *pContentData,int( *Func)(LPVOID lpParam,const bool), LPVOID lpParam);
// DLC
void RegisterMarketplaceCountsCallback(int ( *Func)(LPVOID lpParam, C4JStorage::DLC_TMS_DETAILS *, int), LPVOID lpParam );
void SetDLCPackageRoot(char *pszDLCRoot);
C4JStorage::EDLCStatus GetDLCOffers(int iPad,int( *Func)(LPVOID, int, DWORD, int),LPVOID lpParam, DWORD dwOfferTypesBitmask=XMARKETPLACE_OFFERING_TYPE_CONTENT);
DWORD CancelGetDLCOffers();
void ClearDLCOffers();
//XMARKETPLACE_CONTENTOFFER_INFO& GetOffer(DWORD dw);
XMARKETPLACE_CURRENCY_CONTENTOFFER_INFO& GetOffer(DWORD dw);
int GetOfferCount();
DWORD InstallOffer(int iOfferIDC,unsigned __int64 *ullOfferIDA,int( *Func)(LPVOID, int, int),LPVOID lpParam, bool bTrial=false);
DWORD GetAvailableDLCCount( int iPad);
C4JStorage::EDLCStatus GetInstalledDLC(int iPad,int( *Func)(LPVOID, int, int),LPVOID lpParam);
XCONTENT_DATA& GetDLC(DWORD dw);
DWORD MountInstalledDLC(int iPad,DWORD dwDLC,int( *Func)(LPVOID, int, DWORD,DWORD),LPVOID lpParam,LPCSTR szMountDrive=NULL);
DWORD UnmountInstalledDLC(LPCSTR szMountDrive=NULL);
// Global title storage
C4JStorage::ETMSStatus ReadTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,C4JStorage::eTMS_FileType eFileType,
WCHAR *pwchFilename,BYTE **ppBuffer,DWORD *pdwBufferSize,int( *Func)(LPVOID, WCHAR *,int, bool, int)=NULL,LPVOID lpParam=NULL, int iAction=0);
bool WriteTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,WCHAR *pwchFilename,BYTE *pBuffer,DWORD dwBufferSize);
bool DeleteTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,WCHAR *pwchFilename);
void StoreTMSPathName(WCHAR *pwchName=NULL);
// TMS++
C4JStorage::ETMSStatus TMSPP_WriteFile(int iPad,C4JStorage::eGlobalStorage eStorageFacility,C4JStorage::eTMS_FILETYPEVAL eFileTypeVal,C4JStorage::eTMS_UGCTYPE eUGCType,CHAR *pchFilePath,CHAR *pchBuffer,DWORD dwBufferSize,int( *Func)(LPVOID,int,int)=NULL,LPVOID lpParam=NULL, int iUserData=0);
C4JStorage::ETMSStatus TMSPP_GetUserQuotaInfo(int iPad,TMSCLIENT_CALLBACK Func,LPVOID lpParam, int iUserData=0);
C4JStorage::ETMSStatus TMSPP_ReadFile(int iPad,C4JStorage::eGlobalStorage eStorageFacility,C4JStorage::eTMS_FILETYPEVAL eFileTypeVal,LPCSTR szFilename,int( *Func)(LPVOID,int,int,PTMSPP_FILEDATA, LPCSTR)=NULL,LPVOID lpParam=NULL, int iUserData=0);
C4JStorage::ETMSStatus TMSPP_ReadFileList(int iPad,C4JStorage::eGlobalStorage eStorageFacility,CHAR *pchFilePath,int( *Func)(LPVOID,int,int,PTMSPP_FILE_LIST)=NULL,LPVOID lpParam=NULL, int iUserData=0);
C4JStorage::ETMSStatus TMSPP_DeleteFile(int iPad,LPCSTR szFilePath,C4JStorage::eTMS_FILETYPEVAL eFileTypeVal,int( *Func)(LPVOID,int,int),LPVOID lpParam=NULL, int iUserData=0);
bool TMSPP_InFileList(eGlobalStorage eStorageFacility, int iPad,const wstring &Filename);
unsigned int CRC(unsigned char *buf, int len);
C4JStorage::ETMSStatus TMSPP_WriteFileWithProgress(int iPad,C4JStorage::eGlobalStorage eStorageFacility,C4JStorage::eTMS_FILETYPEVAL eFileTypeVal,C4JStorage::eTMS_UGCTYPE eUGCType,CHAR *pchFilePath,CHAR *pchBuffer,DWORD dwBufferSize,int( *Func)(LPVOID,int,int)=NULL,LPVOID lpParam=NULL, int iUserData=0,
int( *CompletionFunc)(LPVOID,float fComplete)=NULL,LPVOID lpCompletionParam=NULL);
void TMSPP_CancelWriteFileWithProgress(int iPad);
HRESULT TMSPP_SetTitleGroupID(LPCSTR szGroupID);
// #ifdef _DEBUG
// void SetSaveName(int i);
// #endif
// string table for all the Storage problems. Loaded by the application
CXuiStringTable *m_pStringTable;
};
extern C4JStorage StorageManager;

View File

@@ -0,0 +1,55 @@
/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
xsgx_xtms.h
--*/
#include "xtms.h"
#pragma once
#if defined(__cplusplus)
extern "C" {
#endif
#ifndef XSGX_MOD1
typedef
VOID
(CALLBACK * TMSCLIENT_PROG_CALLBACK)(
__in float progress,
__in_opt void* userCallbackData
);
XBOXAPI
HRESULT
WINAPI
XSGX_XTmsPutUserFile(
__in HTMSCLIENT tmsClient,
__in XUID xuid,
__in_z LPCSTR filePath,
__in_z LPCSTR fileType,
__in_z LPCSTR displayName,
__in_z LPCSTR ugcContentType,
__in_bcount(fileSize) CONST CHAR* fileBuffer,
__in DWORD fileSize,
__in_opt DWORD bufferSize,
__in_z_opt LPCSTR etag,
__in ETAGFLAG etagFlag,
__in TMSCLIENT_CALLBACK clientCallback,
__in_opt PVOID userCallbackData,
__in TMSCLIENT_PROG_CALLBACK clientProgCallback,
__in_opt PVOID progCallbackData
);
void XSGX_XTmsCancelPutUserFile(__in HTMSCLIENT tmsClient);
#endif
#if defined(__cplusplus)
}
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,110 @@
#pragma once
class Mob;
class Options;
using namespace std;
#include "..\..\..\Minecraft.World\SoundTypes.h"
#ifdef _XBOX
extern IXAudio2* g_pXAudio2; // pointer to XAudio2 instance used by QNet and XACT
extern IXAudio2MasteringVoice* g_pXAudio2MasteringVoice; // pointer to XAudio2 mastering voice
#endif
class SoundEngine : public ConsoleSoundEngine
{
#ifdef _XBOX
//static const unsigned char *ucSoundNames[eSoundType_MAX][32];
static const int MAX_POLYPHONY = 30; // 4J added
static const int MAX_SAME_SOUNDS_PLAYING = 8; // 4J added
static IXACT3Engine *m_pXACT3Engine;
static X3DAUDIO_HANDLE m_xact3dInstance;
static X3DAUDIO_DSP_SETTINGS m_DSPSettings;
static X3DAUDIO_EMITTER m_emitter;
static X3DAUDIO_LISTENER m_listeners[4];
static int m_validListenerCount;
static X3DAUDIO_DISTANCE_CURVE m_VolumeCurve;
static X3DAUDIO_DISTANCE_CURVE_POINT m_VolumeCurvePoints[2];
static X3DAUDIO_DISTANCE_CURVE m_DragonVolumeCurve;
static X3DAUDIO_DISTANCE_CURVE_POINT m_DragonVolumeCurvePoints[2];
static X3DAUDIO_DISTANCE_CURVE m_VolumeCurveNoDecay;
static X3DAUDIO_DISTANCE_CURVE_POINT m_VolumeCurvePointsNoDecay[2];
static IXACT3WaveBank *m_pWaveBank;
static IXACT3WaveBank *m_pWaveBank2;
static IXACT3WaveBank *m_pStreamedWaveBank;
static IXACT3WaveBank *m_pStreamedWaveBankAdditional;
static IXACT3SoundBank *m_pSoundBank;
static IXACT3SoundBank *m_pSoundBank2;
static CRITICAL_SECTION m_CS;
struct soundInfo
{
// 4J-PB - adding the cue index so we can limit the number of the same sounds playing (rain)
XACTINDEX idx;
int iSoundBank;
eSOUND_TYPE eSoundID;
float x, y, z;
float volume;
float pitch;
IXACT3Cue *pCue;
bool updatePos;
};
void update3DPosition( soundInfo *pInfo, bool bPlaceEmitterAtListener = false, bool bIsCDMusic = false);
static vector<soundInfo *>currentSounds;
int noMusicDelay;
Random *random;
// 4J Added
#endif
#ifdef _XBOX
char * m_chMusicName;
soundInfo m_MusicInfo;
XACTINDEX m_musicIDX;
bool m_bStreamingMusicReady;
bool m_bStreamingWaveBank1Ready;
bool m_bStreamingWaveBank2Ready;
// to handle volume changes
XACTCATEGORY m_xactSFX;
XACTCATEGORY m_xactMusic;
#endif
public:
SoundEngine();
virtual void destroy();
virtual void play(int iSound, float x, float y, float z, float volume, float pitch);
virtual void playStreaming(const wstring& name, float x, float y , float z, float volume, float pitch, bool bMusicDelay=true);
virtual void playUI(int iSound, float volume, float pitch);
virtual void playMusicTick();
virtual void updateMusicVolume(float fVal);
virtual void updateSystemMusicPlaying(bool isPlaying);
virtual void updateSoundEffectVolume(float fVal);
virtual void init(Options *);
virtual void tick(shared_ptr<Mob> *players, float a); // 4J - updated to take array of local players rather than single one
virtual void add(const wstring& name, File *file);
virtual void addMusic(const wstring& name, File *file);
virtual void addStreaming(const wstring& name, File *file);
#ifndef __PS3__
static void setXACTEngine( IXACT3Engine *pXACT3Engine);
void CreateStreamingWavebank(const char *pchName, IXACT3WaveBank **ppStreamedWaveBank);
void CreateSoundbank(const char *pchName, IXACT3SoundBank **ppSoundBank);
#endif // __PS3__
virtual char *ConvertSoundPathToName(const wstring& name, bool bConvertSpaces=false);
bool isStreamingWavebankReady(); // 4J Added
#ifdef _XBOX
bool isStreamingWavebankReady(IXACT3WaveBank *pWaveBank);
#endif
int initAudioHardware(int iMinSpeakers) { return iMinSpeakers;}
private:
#ifndef __PS3__
static void XACTNotificationCallback( const XACT_NOTIFICATION* pNotification );
#endif // __PS3__
};

View File

@@ -0,0 +1,3 @@
Copy Online\584111F700000000 .\584111F700000000
Arcadelicense full 584111F700000000
pause

View File

@@ -0,0 +1,3 @@
Copy Online\584111F700000000 .\584111F700000000
Arcadelicense trial 584111F700000000
pause

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,503 @@
#include "stdafx.h"
#include "..\..\Tesselator.h"
#include "XUI_FontData.h"
#include "XUI_Font.h"
extern IDirect3DDevice9 *g_pD3DDevice;
//--------------------------------------------------------------------------------------
// Name: XUI_Font()
// Desc: Constructor
//--------------------------------------------------------------------------------------
XUI_Font::XUI_Font(int iFontData, float scaleFactor, XUI_FontData *fontData)
: m_iFontData(iFontData), m_fScaleFactor(scaleFactor)
{
m_fontData = fontData;
refCount = 0;
m_fCursorX = 0.0f;
m_fCursorY = 0.0f;
m_fXScaleFactor = m_fYScaleFactor = scaleFactor;
m_fSlantFactor = 0.0f;
m_bRotate = FALSE;
m_dRotCos = cos( 0.0 );
m_dRotSin = sin( 0.0 );
m_dwNestedBeginCount = 0L;
// Initialize the window
D3DDISPLAYMODE DisplayMode;
g_pD3DDevice->GetDisplayMode( 0, &DisplayMode );
m_rcWindow.x1 = 0;
m_rcWindow.y1 = 0;
m_rcWindow.x2 = DisplayMode.Width;
m_rcWindow.y2 = DisplayMode.Height;
}
//--------------------------------------------------------------------------------------
// Name: ~XUI_Font()
// Desc: Destructor
//--------------------------------------------------------------------------------------
XUI_Font::~XUI_Font()
{
}
//--------------------------------------------------------------------------------------
// Name: GetTextExtent()
// Desc: Get the dimensions of a text string
//--------------------------------------------------------------------------------------
VOID XUI_Font::GetTextExtent( const WCHAR* strText, FLOAT* pWidth,
FLOAT* pHeight, BOOL bFirstLineOnly ) const
{
assert( pWidth != NULL );
assert( pHeight != NULL );
// Set default text extent in output parameters
int iWidth = 0;
FLOAT fHeight = 0.0f;
if( strText )
{
// Initialize counters that keep track of text extent
int ix = 0;
FLOAT fy = m_fontData->getFontHeight(); // One character high to start
if( fy > fHeight )
fHeight = fy;
// Loop through each character and update text extent
DWORD letter;
while( (letter = *strText) != 0 )
{
++strText;
// Handle newline character
if( letter == L'\n' )
{
if( bFirstLineOnly )
break;
ix = 0;
fy += m_fontData->getFontYAdvance();
// since the height has changed, test against the height extent
if( fy > fHeight )
fHeight = fy;
}
// Handle carriage return characters by ignoring them. This helps when
// displaying text from a file.
if( letter == L'\r' )
continue;
// Translate unprintable characters
XUI_FontData::SChar sChar = m_fontData->getChar(letter);
// Get text extent for this character's glyph
ix += sChar.getOffset();
ix += sChar.getWAdvance();
// Since the x widened, test against the x extent
if (ix > iWidth) iWidth = ix;
}
}
// Convert the width to a float here, load/hit/store. :(
FLOAT fWidth = static_cast<FLOAT>(iWidth); // Delay the use if fWidth to reduce LHS pain
// Apply the scale factor to the result
fHeight *= m_fYScaleFactor;
// Store the final results
*pHeight = fHeight;
fWidth *= m_fXScaleFactor;
*pWidth = fWidth;
}
//--------------------------------------------------------------------------------------
// Name: GetTextWidth()
// Desc: Returns the width in pixels of a text string
//--------------------------------------------------------------------------------------
FLOAT XUI_Font::GetTextWidth( const WCHAR* strText ) const
{
FLOAT fTextWidth;
FLOAT fTextHeight;
GetTextExtent( strText, &fTextWidth, &fTextHeight );
return fTextWidth;
}
//--------------------------------------------------------------------------------------
// Name: Begin()
// Desc: Prepares the font vertex buffers for rendering.
//--------------------------------------------------------------------------------------
VOID XUI_Font::Begin()
{
PIXBeginNamedEvent( 0, "Text Rendering" );
// Set state on the first call
if( 0 == m_dwNestedBeginCount )
{
// Cache the global pointer into a register
IDirect3DDevice9 *pD3dDevice = g_pD3DDevice;
assert( pD3dDevice );
// Set the texture scaling factor as a vertex shader constant
//D3DSURFACE_DESC TextureDesc;
//m_pFontTexture->GetLevelDesc( 0, &TextureDesc ); // Get the description
// Set render state
assert(m_fontData->m_pFontTexture != NULL || m_fontData->m_iFontTexture > 0);
if(m_fontData->m_pFontTexture != NULL)
{
pD3dDevice->SetTexture( 0, m_fontData->m_pFontTexture );
}
else
{
glBindTexture(GL_TEXTURE_2D, m_fontData->m_iFontTexture);
}
//// Read the TextureDesc here to ensure no load/hit/store from GetLevelDesc()
//FLOAT vTexScale[4];
//vTexScale[0] = 1.0f / TextureDesc.Width; // LHS due to int->float conversion
//vTexScale[1] = 1.0f / TextureDesc.Height;
//vTexScale[2] = 0.0f;
//vTexScale[3] = 0.0f;
//
//pD3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
//pD3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
//pD3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
//pD3dDevice->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD );
//pD3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
//pD3dDevice->SetRenderState( D3DRS_ALPHAREF, 0x08 );
//pD3dDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL );
//pD3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
//pD3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );
//pD3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE );
//pD3dDevice->SetRenderState( D3DRS_STENCILENABLE, FALSE );
//pD3dDevice->SetRenderState( D3DRS_VIEWPORTENABLE, FALSE );
//pD3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
//pD3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
//pD3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP );
//pD3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP );
}
// Keep track of the nested begin/end calls.
m_dwNestedBeginCount++;
}
//--------------------------------------------------------------------------------------
// Name: DrawText()
// Desc: Draws text as textured polygons
//--------------------------------------------------------------------------------------
VOID XUI_Font::DrawText( DWORD dwColor, const WCHAR* strText, DWORD dwFlags,
FLOAT fMaxPixelWidth )
{
DrawText( m_fCursorX, m_fCursorY, dwColor, strText, dwFlags, fMaxPixelWidth );
}
//--------------------------------------------------------------------------------------
// Name: DrawShadowText()
// Desc: Draws text as textured polygons
//--------------------------------------------------------------------------------------
VOID XUI_Font::DrawShadowText( FLOAT fOriginX, FLOAT fOriginY, DWORD dwColor, DWORD dwShadowColor,
const WCHAR* strText, DWORD dwFlags, FLOAT fMaxPixelWidth)
{
float fXShadow=1.0f, fYShadow=1.0f;
// 4J Stu - Don't move the drop shadow as much
//DrawText( fOriginX + (1*m_fXScaleFactor), fOriginY + (1*m_fYScaleFactor), dwColor, strText, dwFlags, fMaxPixelWidth, true );
// 4J-PB - if we're in 480 widescreen, we need to draw the drop shadow at +2 pixels, so that when the scene is halved, it's at +1
if(!RenderManager.IsHiDef())
{
if(RenderManager.IsWidescreen())
{
fXShadow=2.0f;
fYShadow=2.0f;
}
//else
//{
// 480 SD mode - the draw text call will reposition the y
//}
}
DrawText( fOriginX + fXShadow, fOriginY + fYShadow, dwColor, strText, dwFlags, fMaxPixelWidth, true );
DrawText( fOriginX, fOriginY, dwColor, strText, dwFlags, fMaxPixelWidth );
//DrawText( fOriginX + 1, fOriginY + 1, dwShadowColor, strText, dwFlags, fMaxPixelWidth);
//DrawText( fOriginX, fOriginY, dwColor, strText, dwFlags, fMaxPixelWidth );
}
//--------------------------------------------------------------------------------------
// Name: DrawText()
// Desc: Draws text as textured polygons
// TODO: This function should use the Begin/SetVertexData/End() API when it
// becomes available.
//--------------------------------------------------------------------------------------
VOID XUI_Font::DrawText( FLOAT fOriginX, FLOAT fOriginY, DWORD dwColor,
const WCHAR* strText, DWORD dwFlags, FLOAT fMaxPixelWidth, bool darken /*= false*/ )
{
if( NULL == strText ) return;
if( L'\0' == strText[0] ) return;
// 4J-PB - if we're in 480 widescreen mode, we need to ensure that the font characters are aligned on an even boundary if they are a 2x multiple
if(!RenderManager.IsHiDef())
{
if(RenderManager.IsWidescreen())
{
int iScaleX=(int)m_fXScaleFactor;
int iOriginX;
if(iScaleX%2==0)
{
iOriginX=(int)fOriginX;
if(iOriginX%2==1)
{
fOriginX+=1.0f;
}
}
int iScaleY=(int)m_fYScaleFactor;
int iOriginY;
if(iScaleY%2==0)
{
iOriginY=(int)fOriginY;
if(iOriginY%2==1)
{
fOriginY+=1.0f;
}
}
}
else
{
// 480 SD mode - y needs to be on a pixel boundary when multiplied by 1.5, so if it's an odd number, subtract 1/3 from it
int iOriginY=(int)fOriginY;
if(iOriginY%2==1)
{
fOriginY-=1.0f/3.0f;
}
}
}
// Create a PIX user-defined event that encapsulates all of the text draw calls.
// This makes DrawText calls easier to recognize in PIX captures, and it makes
// them take up fewer entries in the event list.
PIXBeginNamedEvent( dwColor, "DrawText: %S", strText );
// Set up stuff to prepare for drawing text
Begin();
if (darken)
{
int oldAlpha = dwColor & 0xff000000;
dwColor = (dwColor & 0xfcfcfc) >> 2;
dwColor += oldAlpha;
}
float r = ((dwColor >> 16) & 0xff) / 255.0f;
float g = ((dwColor >> 8) & 0xff) / 255.0f;
float b = ((dwColor) & 0xff) / 255.0f;
float a = ((dwColor >> 24) & 0xff) / 255.0f;
if (a == 0) a = 1;
// a = 1;
glColor4f(r, g, b, a);
// Set the starting screen position
if( ( fOriginX < 0.0f ) || ( ( dwFlags & ATGFONT_RIGHT ) && ( fOriginX <= 0.0f ) ) )
{
fOriginX += ( m_rcWindow.x2 - m_rcWindow.x1 );
}
// 4J-PB - not sure what this code was intending to do, but it removed a line of text that is slightly off the top of the control, rather than having it partially render
// if( fOriginY < 0.0f )
// {
// fOriginY += ( m_rcWindow.y2 - m_rcWindow.y1 );
// }
m_fCursorX = floorf( fOriginX );
m_fCursorY = floorf( fOriginY );
// Adjust for padding
fOriginY -= m_fontData->getFontTopPadding();
XUI_FontData::SChar sChar = m_fontData->getChar(L'.');
FLOAT fEllipsesPixelWidth = m_fXScaleFactor * 3.0f * (sChar.getOffset() + sChar.getWAdvance());
if( dwFlags & ATGFONT_TRUNCATED )
{
// Check if we will really need to truncate the string
if( fMaxPixelWidth <= 0.0f )
{
dwFlags &= ( ~ATGFONT_TRUNCATED );
}
else
{
FLOAT w, h;
GetTextExtent( strText, &w, &h, TRUE );
// If not, then clear the flag
if( w <= fMaxPixelWidth )
dwFlags &= ( ~ATGFONT_TRUNCATED );
}
}
// If vertically centered, offset the starting m_fCursorY value
if( dwFlags & ATGFONT_CENTER_Y )
{
FLOAT w, h;
GetTextExtent( strText, &w, &h );
m_fCursorY = floorf( m_fCursorY - (h * 0.5f) );
}
// Add window offsets
FLOAT Winx = static_cast<FLOAT>(m_rcWindow.x1);
FLOAT Winy = static_cast<FLOAT>(m_rcWindow.y1);
fOriginX += Winx;
fOriginY += Winy;
m_fCursorX += Winx;
m_fCursorY += Winy;
// Set a flag so we can determine initial justification effects
BOOL bStartingNewLine = TRUE;
DWORD dwNumEllipsesToDraw = 0;
// Begin drawing the vertices
DWORD dwNumChars = wcslen( strText ) + ( dwFlags & ATGFONT_TRUNCATED ? 3 : 0 );
bStartingNewLine = TRUE;
// Draw four vertices for each glyph
while( *strText )
{
WCHAR letter;
if( dwNumEllipsesToDraw )
{
letter = L'.';
}
else
{
// If starting text on a new line, determine justification effects
if( bStartingNewLine )
{
if( dwFlags & ( ATGFONT_RIGHT | ATGFONT_CENTER_X ) )
{
// Get the extent of this line
FLOAT w, h;
GetTextExtent( strText, &w, &h, TRUE );
// Offset this line's starting m_fCursorX value
if( dwFlags & ATGFONT_RIGHT )
m_fCursorX = floorf( fOriginX - w );
if( dwFlags & ATGFONT_CENTER_X )
m_fCursorX = floorf( fOriginX - w * 0.5f );
}
bStartingNewLine = FALSE;
}
// Get the current letter in the string
letter = *strText++;
// Handle the newline character
if( letter == L'\n' )
{
m_fCursorX = fOriginX;
m_fCursorY += m_fontData->getFontYAdvance() * m_fYScaleFactor;
bStartingNewLine = TRUE;
continue;
}
// Handle carriage return characters by ignoring them. This helps when
// displaying text from a file.
if( letter == L'\r' )
continue;
}
// Translate unprintable characters
XUI_FontData::SChar sChar = m_fontData->getChar( letter );
FLOAT fOffset = m_fXScaleFactor * ( FLOAT )sChar.getOffset();
FLOAT fAdvance = m_fXScaleFactor * ( FLOAT )sChar.getWAdvance();
// 4J Use the font max width otherwise scaling doesnt look right
FLOAT fWidth = m_fXScaleFactor * (sChar.tu2() - sChar.tu1());//( FLOAT )pGlyph->wWidth;
FLOAT fHeight = m_fYScaleFactor * m_fontData->getFontHeight();
if( 0 == dwNumEllipsesToDraw )
{
if( dwFlags & ATGFONT_TRUNCATED )
{
// Check if we will be exceeded the max allowed width
if( m_fCursorX + fOffset + fWidth + fEllipsesPixelWidth + m_fSlantFactor > fOriginX + fMaxPixelWidth )
{
// Yup, draw the three ellipses dots instead
dwNumEllipsesToDraw = 3;
continue;
}
}
}
// Setup the screen coordinates
m_fCursorX += fOffset;
FLOAT X4 = m_fCursorX;
FLOAT X1 = X4 + m_fSlantFactor;
FLOAT X3 = X4 + fWidth;
FLOAT X2 = X1 + fWidth;
FLOAT Y1 = m_fCursorY;
FLOAT Y3 = Y1 + fHeight;
FLOAT Y2 = Y1;
FLOAT Y4 = Y3;
m_fCursorX += fAdvance;
// Add the vertices to draw this glyph
FLOAT tu1 = sChar.tu1() / (float)m_fontData->getImageWidth();
FLOAT tv1 = sChar.tv1() / (float)m_fontData->getImageHeight();
FLOAT tu2 = sChar.tu2() / (float)m_fontData->getImageWidth();
FLOAT tv2 = sChar.tv2() / (float)m_fontData->getImageHeight();
Tesselator *t = Tesselator::getInstance();
t->begin();
t->vertexUV(X1, Y1, 0.0f, tu1, tv1);
t->vertexUV(X2, Y2, 0.0f, tu2, tv1);
t->vertexUV(X3, Y3, 0.0f, tu2, tv2);
t->vertexUV(X4, Y4, 0.0f, tu1, tv2);
t->end();
// If drawing ellipses, exit when they're all drawn
if( dwNumEllipsesToDraw )
{
if( --dwNumEllipsesToDraw == 0 )
break;
}
dwNumChars--;
}
// Undo window offsets
m_fCursorX -= Winx;
m_fCursorY -= Winy;
// Call End() to complete the begin/end pair for drawing text
End();
// Close off the user-defined event opened with PIXBeginNamedEvent.
PIXEndNamedEvent();
}
//--------------------------------------------------------------------------------------
// Name: End()
// Desc: Paired call that restores state set in the Begin() call.
//--------------------------------------------------------------------------------------
VOID XUI_Font::End()
{
assert( m_dwNestedBeginCount > 0 );
if( --m_dwNestedBeginCount > 0 )
{
PIXEndNamedEvent();
return;
}
PIXEndNamedEvent();
}

View File

@@ -0,0 +1,93 @@
#pragma once
class XUI_FontData;
// 4J This class is partially based of the ATG font implementation, modified to suit our uses for XUI
//--------------------------------------------------------------------------------------
// Flags for the Font::DrawText() function (Or them together to combine features)
//--------------------------------------------------------------------------------------
#define ATGFONT_LEFT 0x00000000
#define ATGFONT_RIGHT 0x00000001
#define ATGFONT_CENTER_X 0x00000002
#define ATGFONT_CENTER_Y 0x00000004
#define ATGFONT_TRUNCATED 0x00000008
class XUI_Font
{
public:
XUI_FontData *m_fontData;
public:
const int m_iFontData;
const float m_fScaleFactor;
FLOAT m_fXScaleFactor; // Scaling constants
FLOAT m_fYScaleFactor;
FLOAT m_fSlantFactor; // For italics
DOUBLE m_dRotCos; // Precalculated sine and cosine for italic like rotation
DOUBLE m_dRotSin;
D3DRECT m_rcWindow; // Bounds rect if the text window, modify via accessors only!
FLOAT m_fCursorX; // Current text cursor
FLOAT m_fCursorY;
BOOL m_bRotate;
DWORD m_dwNestedBeginCount;
wstring m_fontName;
wstring m_fallbackFont;
DWORD refCount;
public:
float getScaleFactor() { return m_fScaleFactor; }
void GetScaleFactors(FLOAT *pfXScaleFactor, FLOAT *pfYScaleFactor) { *pfXScaleFactor = m_fScaleFactor; *pfYScaleFactor = m_fScaleFactor; }
// Accessor functions
inline VOID SetSlantFactor( FLOAT fSlantFactor )
{
m_fSlantFactor = fSlantFactor;
}
inline VOID SetScaleFactors( FLOAT fXScaleFactor, FLOAT fYScaleFactor )
{
// m_fXScaleFactor = m_fYScaleFactor = m_fScaleFactor;
}
void SetFallbackFont(const wstring &fallbackFont) { m_fallbackFont = fallbackFont; }
void IncRefCount() { ++refCount; }
void DecRefCount() { --refCount; }
public:
XUI_Font(int iFontData, float scaleFactor, XUI_FontData *fontData);
~XUI_Font();
// Returns the dimensions of a text string
VOID GetTextExtent( const WCHAR* strText, FLOAT* pWidth,
FLOAT* pHeight, BOOL bFirstLineOnly=FALSE ) const;
FLOAT GetTextWidth( const WCHAR* strText ) const;
FLOAT GetCharAdvance( const WCHAR* strChar ) const;
VOID SetWindow(const D3DRECT &rcWindow );
VOID SetWindow( LONG x1, LONG y1, LONG x2, LONG y2 );
VOID GetWindow(D3DRECT &rcWindow) const;
VOID SetCursorPosition( FLOAT fCursorX, FLOAT fCursorY );
VOID SetRotationFactor( FLOAT fRotationFactor );
// Function to create a texture containing rendered text
D3DTexture* CreateTexture( const WCHAR* strText,
D3DCOLOR dwBackgroundColor = 0x00000000,
D3DCOLOR dwTextColor = 0xffffffff,
D3DFORMAT d3dFormat = D3DFMT_A8R8G8B8 );
// Public calls to render text. Callers can simply call DrawText(), but for
// performance, they should batch multiple calls together, bracketed by calls to
// Begin() and End().
VOID Begin();
VOID DrawText( DWORD dwColor, const WCHAR* strText, DWORD dwFlags=0L,
FLOAT fMaxPixelWidth = 0.0f );
VOID DrawText( FLOAT sx, FLOAT sy, DWORD dwColor, const WCHAR* strText,
DWORD dwFlags=0L, FLOAT fMaxPixelWidth = 0.0f, bool darken = false );
VOID DrawShadowText( FLOAT sx, FLOAT sy, DWORD dwColor, DWORD dwShadowColor, const WCHAR* strText,
DWORD dwFlags=0L, FLOAT fMaxPixelWidth = 0.0f );
VOID End();
};

View File

@@ -0,0 +1,395 @@
#include "stdafx.h"
#include "..\..\stubs.h"
#include "..\..\Minecraft.h"
#include "..\..\Textures.h"
#include "XUI_FontData.h"
#include "..\..\..\Minecraft.World\StringHelpers.h"
#define USE_NEW 0
extern IDirect3DDevice9 *g_pD3DDevice;
int XUI_FontData::getMaxGlyph()
{
return m_fontData->getFontData()->m_uiGlyphCount;
}
float XUI_FontData::getFontHeight()
{
return m_fontData->getFontData()->m_uiGlyphHeight;
}
float XUI_FontData::getFontTopPadding()
{
return 0;
}
float XUI_FontData::getFontBottomPadding()
{
return 0;
}
float XUI_FontData::getFontYAdvance()
{
return m_fontData->getFontData()->m_uiGlyphHeight - 1;
}
float XUI_FontData::getFontMaxWidth()
{
return m_fontData->getFontData()->m_uiGlyphWidth;
}
float XUI_FontData::getMaxDescent()
{
return 0;
}
float XUI_FontData::getMaxAscent()
{
return m_fontData->getFontData()->m_uiGlyphHeight;
}
int XUI_FontData::getImageWidth()
{
return m_fontData->getFontData()->m_uiGlyphMapX;
}
int XUI_FontData::getImageHeight()
{
return m_fontData->getFontData()->m_uiGlyphMapY;
}
float XUI_FontData::SChar::getMinX()
{
return 0.0f;
}
float XUI_FontData::SChar::getMaxX()
{
return (float) m_parent->m_fontData->getFontData()->m_uiGlyphWidth;
}
float XUI_FontData::SChar::getMinY()
{
return 0.0f;
}
float XUI_FontData::SChar::getMaxY()
{
return 0.0f; //m_parent->m_fontData->getFontData()->m_uiGlyphHeight;
}
float XUI_FontData::SChar::getAdvance()
{
return (float) m_parent->m_fontData->getWidth(m_glyphId);
}
int XUI_FontData::SChar::getGlyphId()
{
return m_glyphId;
}
#define USE_NEW_UV 1
int XUI_FontData::SChar::tu1()
{
#if USE_NEW_UV
int row = 0, col = 0;
m_parent->m_fontData->getPos(m_glyphId, row, col);
return col * m_parent->m_fontData->getFontData()->m_uiGlyphWidth;
#else
return m_parent->m_Glyphs[m_glyphId].tu1;
#endif
}
int XUI_FontData::SChar::tu2()
{
#if USE_NEW_UV
return tu1() + m_parent->m_fontData->getFontData()->m_uiGlyphWidth;
#else
return m_parent->m_Glyphs[m_glyphId].tu2;
#endif
}
int XUI_FontData::SChar::tv1()
{
#if USE_NEW_UV
int row = 0, col = 0;
m_parent->m_fontData->getPos(m_glyphId, row, col);
return row * m_parent->m_fontData->getFontData()->m_uiGlyphHeight + 1;
#else
return m_parent->m_Glyphs[m_glyphId].tv1;
#endif
}
int XUI_FontData::SChar::tv2()
{
#if USE_NEW_UV
return tv1() + m_parent->m_fontData->getFontData()->m_uiGlyphHeight;
#else
return m_parent->m_Glyphs[m_glyphId].tv2;
#endif
}
short XUI_FontData::SChar::getOffset()
{
return 0;
}
short XUI_FontData::SChar::getWAdvance()
{
return 0;
}
XUI_FontData::SChar XUI_FontData::getChar(const wchar_t strChar)
{
SChar out;
out.m_glyphId = m_fontData->getGlyphId((unsigned int) strChar);
out.m_parent = this;
return out;
}
//--------------------------------------------------------------------------------------
// Name: XUI_FontData()
// Desc: Constructor
//--------------------------------------------------------------------------------------
XUI_FontData::XUI_FontData()
{
m_pFontTexture = NULL;
m_iFontTexture = -1;
m_dwNumGlyphs = 0L;
m_Glyphs = NULL;
m_cMaxGlyph = 0;
m_dwNestedBeginCount = 0L;
}
//--------------------------------------------------------------------------------------
// Name: ~XUI_FontData()
// Desc: Destructor
//--------------------------------------------------------------------------------------
XUI_FontData::~XUI_FontData()
{
Destroy();
}
//--------------------------------------------------------------------------------------
// Name: Create()
// Desc: Create the font's internal objects (texture and array of glyph info)
// using the XPR packed resource file
//--------------------------------------------------------------------------------------
HRESULT XUI_FontData::Create( SFontData &sfontdata )
{
#ifndef _CONTENT_PACKAGE
app.DebugPrintf("Attempting to load font data for font: '%s'\n", sfontdata.m_strFontName.c_str());
#endif
BufferedImage *img = new BufferedImage(sfontdata.m_wstrFilename, false, true);
m_iFontTexture = Minecraft::GetInstance()->textures->getTexture(img, C4JRender::TEXTURE_FORMAT_RxGyBzAw, false);
int imgWidth = img->getWidth(), imgHeight = img->getHeight();
intArray rawPixels(imgWidth * imgHeight);
img->getRGB(0, 0, imgWidth, imgHeight, rawPixels, 0, imgWidth);
delete img;
m_fontData = new CFontData( sfontdata, rawPixels.data );
if (rawPixels.data != NULL) delete [] rawPixels.data;
#if 0
{ // 4J-JEV: Load in FontData (ABC) file, and initialize member variables from it.
const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL);
//wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/font/Mojangles_10.abc");
wsprintfW(szResourceLocator,L"section://%X,%s#%s%s%s",c_ModuleHandle,L"media", L"media/font/",strFontFileName.c_str(),L".abc");
BYTE *buffer;
UINT bufferSize;
hr = XuiResourceLoadAllNoLoc(
szResourceLocator,
&buffer,
&bufferSize
);
if( FAILED(hr) ) app.FatalLoadError();
//return Create( tex, buffer );
hr = Create( m_iFontTexture, buffer );
XuiFree(buffer);
}
// The ABC's are wrong, so recalc
// TODO 4J Stu - This isn't going to change every time we run the app, so really the FontMaker tool needs
// changed, or at the very least the .abc files need pre-processed to store the values we want
int rowV = 0;
int rowXOffset = 0;
for (unsigned int i = 0; i < 299; i++)
{
// Translate unprintable characters
GLYPH_ATTR* pGlyph;
DWORD letter = m_fontData->getGlyphId(i);
if( letter == 0 || letter >= 280 ) continue;
pGlyph = (GLYPH_ATTR*)&m_Glyphs[letter]; // Get the requested glyph
// 4J Stu - The original ABC's were generated for a font height that is 1 pixel higher than our cleaned up version
// We adjust for 1 pixel padding in the y at the top of each box.
pGlyph->tv1++;
if( pGlyph->tv1 != rowV )
{
rowV = pGlyph->tv1;
rowXOffset = 0;
}
if( pGlyph->wOffset > 0 )
{
rowXOffset += pGlyph->wOffset;
pGlyph->wOffset = 0;
}
pGlyph->tu1 -= rowXOffset;
pGlyph->tu2 -= rowXOffset;
int x = pGlyph->tu2-1;
int emptyColumnX = x;
for (; x >= pGlyph->tu1; x--)
{
bool emptyColumn = true;
for (int y = pGlyph->tv1; y < pGlyph->tv2; y++)
{
int rawPix = rawPixels[x + (y*imgWidth)];
DWORD pixel = rawPixels[x + (y*imgWidth)] & 0xff000000;
if (pixel > 0) emptyColumn = false;
}
if (!emptyColumn && emptyColumnX == pGlyph->tu2-1)
{
emptyColumnX = x;
}
}
if(emptyColumnX != pGlyph->tu2-1)
{
pGlyph->wWidth = emptyColumnX-pGlyph->tu1;
pGlyph->wAdvance = pGlyph->wWidth + 1;
}
}
#endif
return S_OK;
}
//--------------------------------------------------------------------------------------
// Name: Create()
// Desc: Create the font's internal objects (texture and array of glyph info)
//--------------------------------------------------------------------------------------
//HRESULT XUI_FontData::Create( D3DTexture* pFontTexture, const VOID* pFontData )
HRESULT XUI_FontData::Create( int iFontTexture, const VOID* pFontData )
{
// Save a copy of the texture
//m_pFontTexture = pFontTexture;
#if 0
m_iFontTexture = iFontTexture;
// Check version of file (to make sure it matches up with the FontMaker tool)
const BYTE* pData = static_cast<const BYTE*>(pFontData);
DWORD dwFileVersion = reinterpret_cast<const FontFileHeaderImage_t *>(pData)->m_dwFileVersion;
if( dwFileVersion == ATGFONTFILEVERSION )
{
//m_fFontHeight = reinterpret_cast<const FontFileHeaderImage_t *>(pData)->m_fFontHeight;
//m_fFontTopPadding = reinterpret_cast<const FontFileHeaderImage_t *>(pData)->m_fFontTopPadding;
//m_fFontBottomPadding = reinterpret_cast<const FontFileHeaderImage_t *>(pData)->m_fFontBottomPadding;
//m_fFontYAdvance = reinterpret_cast<const FontFileHeaderImage_t *>(pData)->m_fFontYAdvance;
// Point to the translator string which immediately follows the 4 floats
m_cMaxGlyph = reinterpret_cast<const FontFileHeaderImage_t *>(pData)->m_cMaxGlyph;
WCHAR* translatorTable = const_cast<FontFileHeaderImage_t*>(reinterpret_cast<const FontFileHeaderImage_t *>(pData))->m_TranslatorTable;
// 4J Stu - This map saves us some memory because the translatorTable is largely empty
// If we were ever to use >50% of the table then we should store it and use directly rather than the map
for( unsigned short i = 0; i < m_cMaxGlyph + 1; ++i )
{
if( translatorTable[i] == 0 ) continue;
m_TranslatorMap.insert( unordered_map<wchar_t, unsigned short>::value_type(i, translatorTable[i]) );
}
pData += ATGCALCFONTFILEHEADERSIZE( m_cMaxGlyph + 1 );
// Read the glyph attributes from the file
m_dwNumGlyphs = reinterpret_cast<const FontFileStrikesImage_t *>(pData)->m_dwNumGlyphs;
m_Glyphs = new GLYPH_ATTR[m_dwNumGlyphs];
memcpy(m_Glyphs, reinterpret_cast<const FontFileStrikesImage_t *>(pData)->m_Glyphs, sizeof(GLYPH_ATTR) * m_dwNumGlyphs);
//m_dwNumGlyphs = m_fontData->getFontData()->m_uiGlyphCount;
}
else
{
app.DebugPrintf( "Incorrect version number on font file!\n" );
return E_FAIL;
}
#endif
return S_OK;
}
//--------------------------------------------------------------------------------------
// Name: Destroy()
// Desc: Destroy the font object
//--------------------------------------------------------------------------------------
VOID XUI_FontData::Destroy()
{
if(m_pFontTexture!=NULL)
{
m_pFontTexture->Release();
delete m_pFontTexture;
}
m_fontData->release();
m_pFontTexture = NULL;
m_dwNumGlyphs = 0L;
m_cMaxGlyph = 0;
m_dwNestedBeginCount = 0L;
}
/*
FLOAT XUI_FontData::GetCharAdvance( const WCHAR* strChar )
{
unsigned int uiChar = (unsigned int) *strChar;
return 0.0f;// m_fontData.getAdvance(m_fontData.getGlyphId(uiChar));
}
FLOAT XUI_FontData::GetCharWidth( const WCHAR* strChar )
{
return 0.0f;
}
void XUI_FontData::GetCharMetrics( const WCHAR* strChar, XUICharMetrics *xuiMetrics)
{
unsigned int uiChar = (unsigned int) *strChar;
unsigned short usGlyph = m_fontData->getGlyphId(uiChar);
xuiMetrics->fAdvance = m_fontData->getWidth(usGlyph); //.getAdvance(usGlyph) * (float) m_fontData.getFontData()->m_uiGlyphHeight;
xuiMetrics->fMaxX = (float) m_fontData->getFontData()->m_uiGlyphWidth;
xuiMetrics->fMinX = 0.0f;
xuiMetrics->fMaxY = 0;// m_fontData.getFontData()->m_fAscent * (float) m_fontData.getFontData()->m_uiGlyphHeight;
xuiMetrics->fMinY = 0;//m_fontData.getFontData()->m_fDescent * (float) m_fontData.getFontData()->m_uiGlyphHeight;
}
unsigned short XUI_FontData::getGlyphId(wchar_t character)
{
return m_fontData->getGlyphId( (unsigned int) character );
}
*/

View File

@@ -0,0 +1,147 @@
#pragma once
using namespace std;
#include <xuirender.h>
#include "..\..\Common\UI\UIFontData.h"
// 4J This class is partially based of the ATG font implementation
//--------------------------------------------------------------------------------------
// Name: GLYPH_ATTR
// Desc: Structure to hold information about one glyph (font character image)
//--------------------------------------------------------------------------------------
typedef struct GLYPH_ATTR
{
WORD tu1, tv1, tu2, tv2; // Texture coordinates for the image
SHORT wOffset; // Pixel offset for glyph start
SHORT wWidth; // Pixel width of the glyph
SHORT wAdvance; // Pixels to advance after the glyph
WORD wMask; // Channel mask
} GLYPH_ATTR;
//
// These two structures are mapped to data loaded from disk.
// DO NOT ALTER ANY ENTRIES OR YOU WILL BREAK
// COMPATIBILITY WITH THE FONT FILE
//
// Font description
#define ATGCALCFONTFILEHEADERSIZE(x) ( sizeof(DWORD) + (sizeof(FLOAT)*4) + sizeof(WORD) + (sizeof(WCHAR)*(x)) )
#define ATGFONTFILEVERSION 5
typedef struct FontFileHeaderImage_t {
DWORD m_dwFileVersion; // Version of the font file (Must match FONTFILEVERSION)
FLOAT m_fFontHeight; // Height of the font strike in pixels
FLOAT m_fFontTopPadding; // Padding above the strike zone
FLOAT m_fFontBottomPadding; // Padding below the strike zone
FLOAT m_fFontYAdvance; // Number of pixels to move the cursor for a line feed
WORD m_cMaxGlyph; // Number of font characters (Should be an odd number to maintain DWORD Alignment)
WCHAR m_TranslatorTable[1]; // ASCII to Glyph lookup table, NOTE: It's m_cMaxGlyph+1 in size.
// Entry 0 maps to the "Unknown" glyph.
} FontFileHeaderImage_t;
// Font strike array. Immediately follows the FontFileHeaderImage_t
// structure image
typedef struct FontFileStrikesImage_t {
DWORD m_dwNumGlyphs; // Size of font strike array (First entry is the unknown glyph)
GLYPH_ATTR m_Glyphs[1]; // Array of font strike uv's etc... NOTE: It's m_dwNumGlyphs in size
} FontFileStrikesImage_t;
typedef struct _CharMetrics
{
// units are pixels at current font size
float fMinX; // min x coordinate
float fMinY; // min y coordinate
float fMaxX; // max x coordinate
float fMaxY; // max y coordinate
float fAdvance; // advance value
} CharMetrics;
class XUI_FontData
{
public:
int getMaxGlyph();
float getFontHeight();
float getFontTopPadding();
float getFontBottomPadding();
float getFontYAdvance();
float getFontMaxWidth();
float getMaxDescent();
float getMaxAscent();
int getImageWidth();
int getImageHeight();
typedef struct
{
friend class XUI_FontData;
private:
unsigned short m_glyphId;
XUI_FontData *m_parent;
public:
bool hasChar() { return true; }
float getMinX();
float getMinY();
float getMaxX();
float getMaxY();
float getAdvance();
int getGlyphId();
int tu1();
int tu2();
int tv1();
int tv2(); // Texture coordinates for the image
short getOffset(); // Pixel offset for glyph start
short getWidth(); // Pixel width of the glyph
short getWAdvance(); // Pixels to advance after the glyph
WORD getMask(); // Channel mask, tv2;
} SChar;
SChar getChar(const wchar_t strChar);
// D3D rendering objects
D3DTexture* m_pFontTexture;
int m_iFontTexture;
private:
unordered_map<wchar_t, unsigned short> m_TranslatorMap;
CharMetrics *m_characterMetrics;
// Translator table for supporting unicode ranges
DWORD m_cMaxGlyph; // Number of entries in the translator table
// Glyph data for the font
DWORD m_dwNumGlyphs; // Number of valid glyphs
GLYPH_ATTR* m_Glyphs; // Array of glyphs
DWORD m_dwNestedBeginCount;
protected:
CFontData *m_fontData;
public:
// Accessor functions
inline D3DTexture* GetTexture() const
{
return m_pFontTexture;
}
public:
XUI_FontData();
~XUI_FontData();
// Functions to create and destroy the internal objects
HRESULT Create( SFontData &sfontdata );
//HRESULT Create( D3DTexture* pFontTexture, const VOID* pFontData );
HRESULT Create( int iFontTexture, const VOID* pFontData );
VOID Destroy();
//FLOAT GetCharAdvance( const WCHAR* strChar );
//FLOAT GetCharWidth( const WCHAR* strChar );
//void GetCharMetrics( const WCHAR* strChar, XUICharMetrics *xuiMetrics);
//unsigned short getGlyphId(wchar_t character);
};

View File

@@ -0,0 +1,307 @@
#include "stdafx.h"
#include "XUI_FontRenderer.h"
#include "XUI_Font.h"
#include "XUI_FontData.h"
#include "..\..\..\Minecraft.World\StringHelpers.h"
extern IDirect3DDevice9 *g_pD3DDevice;
extern void GetRenderAndSamplerStates(IDirect3DDevice9 *pDevice,DWORD *RenderStateA,DWORD *SamplerStateA);
extern void SetRenderAndSamplerStates(IDirect3DDevice9 *pDevice,DWORD *RenderStateA,DWORD *SamplerStateA);
XUI_FontRenderer::XUI_FontRenderer()
{
ZeroMemory(m_loadedFontData, sizeof(XUI_FontData*) * eFontData_MAX);
//XuiFontSetRenderer(this);
//Minecraft *pMinecraft=Minecraft::GetInstance();
//ScreenSizeCalculator ssc(pMinecraft->options, pMinecraft->width_phys, pMinecraft->height_phys);
//m_fScreenWidth=(float)pMinecraft->width_phys;
//m_fRawWidth=(float)ssc.rawWidth;
//m_fScreenHeight=(float)pMinecraft->height_phys;
//m_fRawHeight=(float)ssc.rawHeight;
}
HRESULT XUI_FontRenderer::Init( float fDpi )
{
return( S_OK );
}
VOID XUI_FontRenderer::Term()
{
return;
}
HRESULT XUI_FontRenderer::GetCaps( DWORD * pdwCaps )
{
if( pdwCaps != NULL )
{
// setting this means XUI calls the DrawCharsToDevice method
*pdwCaps = XUI_FONT_RENDERER_CAP_INTERNAL_GLYPH_CACHE | XUI_FONT_RENDERER_CAP_POINT_SIZE_RESPECTED | XUI_FONT_RENDERER_STYLE_DROPSHADOW;
}
return ( S_OK );
}
HRESULT XUI_FontRenderer::CreateFont( const TypefaceDescriptor * pTypefaceDescriptor, float fPointSize, DWORD dwStyle, DWORD dwReserved, HFONTOBJ * phFont )
{
float fXuiSize = fPointSize * ( 16.0f / 14.0f );
//float fXuiSize = fPointSize * ( 16.0f / 16.0f );
fXuiSize /= 4.0f;
fXuiSize = floor( fXuiSize );
int xuiSize = (int)(fXuiSize * 4.0f);
if( xuiSize < 1 ) xuiSize = 8;
// 4J Stu - We have fonts based on multiples of 8 or 12
// We don't want to make the text larger as then it may not fit in the box specified
// so we decrease the size until we find one that will look ok
while( xuiSize%8!=0 && xuiSize%12!=0 ) xuiSize -= 2;
//app.DebugPrintf("point size is: %f, xuiSize is: %d\n", fPointSize, xuiSize);
XUI_Font *font = NULL;
XUI_FontData *fontData = NULL;
FLOAT scale = 1;
eFontData efontdata;
if( xuiSize%12==0 )
{
scale = xuiSize/12;
efontdata = eFontData_Mojangles_11;
}
else
{
scale = xuiSize/8;
efontdata = eFontData_Mojangles_7;
}
font = m_loadedFonts[efontdata][scale];
if (font == NULL)
{
fontData = m_loadedFontData[efontdata];
if (fontData == NULL)
{
SFontData *sfontdata;
switch (efontdata)
{
case eFontData_Mojangles_7: sfontdata = &SFontData::Mojangles_7; break;
case eFontData_Mojangles_11: sfontdata = &SFontData::Mojangles_11; break;
default: sfontdata = NULL; break;
}
fontData = new XUI_FontData();
fontData->Create(*sfontdata);
m_loadedFontData[efontdata] = fontData;
}
font = new XUI_Font( efontdata, scale, fontData );
m_loadedFonts[efontdata][scale] = font;
}
font->IncRefCount();
*phFont = (HFONTOBJ)font;
return S_OK;
}
VOID XUI_FontRenderer::ReleaseFont( HFONTOBJ hFont )
{
XUI_Font *xuiFont = (XUI_Font*) hFont;
if (xuiFont != NULL)
{
xuiFont->DecRefCount();
if (xuiFont->refCount <= 0)
{
AUTO_VAR(it, m_loadedFonts[xuiFont->m_iFontData].find(xuiFont->m_fScaleFactor) );
if (it != m_loadedFonts[xuiFont->m_iFontData].end()) m_loadedFonts[xuiFont->m_iFontData].erase(it);
delete hFont;
}
}
return;
}
HRESULT XUI_FontRenderer::GetFontMetrics( HFONTOBJ hFont, XUIFontMetrics *pFontMetrics )
{
if( hFont == 0 || pFontMetrics == 0 ) return E_INVALIDARG;
XUI_Font *font = (XUI_Font *)hFont;
pFontMetrics->fLineHeight = (font->m_fontData->getFontYAdvance() + 1) * font->m_fYScaleFactor;
pFontMetrics->fMaxAscent = font->m_fontData->getMaxAscent() * font->m_fYScaleFactor;
pFontMetrics->fMaxDescent = font->m_fontData->getMaxDescent() * font->m_fYScaleFactor;
pFontMetrics->fMaxHeight = font->m_fontData->getFontHeight() * font->m_fYScaleFactor;
pFontMetrics->fMaxWidth = font->m_fontData->getFontMaxWidth() * font->m_fXScaleFactor;
pFontMetrics->fMaxAdvance = font->m_fontData->getFontMaxWidth() * font->m_fXScaleFactor;
//*pFontMetrics = font->m_fontMetrics; // g_fontMetrics;
return( S_OK );
}
HRESULT XUI_FontRenderer::GetCharMetrics( HFONTOBJ hFont, WCHAR wch, XUICharMetrics *pCharMetrics )
{
if (hFont == 0 || pCharMetrics == 0) return E_INVALIDARG;
XUI_Font *font = (XUI_Font *)hFont;
XUI_FontData::SChar sChar = font->m_fontData->getChar(wch);
pCharMetrics->fMinX = sChar.getMinX() * font->m_fYScaleFactor;
pCharMetrics->fMinY = sChar.getMinY() * font->m_fYScaleFactor;
pCharMetrics->fMaxX = sChar.getMaxX() * font->m_fYScaleFactor;
pCharMetrics->fMaxY = sChar.getMaxY() * font->m_fYScaleFactor;
pCharMetrics->fAdvance = sChar.getAdvance() * font->m_fYScaleFactor;
return(S_OK);
}
HRESULT XUI_FontRenderer::DrawCharToTexture( HFONTOBJ hFont, WCHAR wch, HXUIDC hDC, IXuiTexture * pTexture, UINT x, UINT y, UINT width, UINT height, UINT insetX, UINT insetY )
{
if( hFont==0 || pTexture==NULL ) return E_INVALIDARG;
return( S_OK );
}
HRESULT XUI_FontRenderer::DrawCharsToDevice( HFONTOBJ hFont, CharData * pCharData, DWORD dwCount, RECT *pClipRect, HXUIDC hDC, D3DXMATRIX * pWorldViewProj )
{
if( hFont == 0 ) return E_INVALIDARG;
if( dwCount == 0 ) return( S_OK );
DWORD RenderStateA[8];
DWORD SamplerStateA[5];
XMVECTOR vconsts[20];
XMVECTOR pconsts[20];
XUI_Font *font = (XUI_Font *)hFont;
// 4J-PB - if we're in 480 Widescreen mode, we need to ensure that the font characters are aligned on an even boundary if they are a 2x multiple
if(!RenderManager.IsHiDef())
{
if(RenderManager.IsWidescreen())
{
float fScaleX, fScaleY;
font->GetScaleFactors(&fScaleX,&fScaleY);
int iScaleX=fScaleX;
int iScaleY=fScaleY;
if(iScaleX%2==0)
{
int iWorldX=pWorldViewProj->_41;
pWorldViewProj->_41 = (float)(iWorldX & -2);
}
if(iScaleY%2==0)
{
int iWorldY=pWorldViewProj->_42;
pWorldViewProj->_42 = (float)(iWorldY & -2);
}
}
else
{
// make x an even number for 480 4:3
int iWorldX=pWorldViewProj->_41;
pWorldViewProj->_41 = (float)(iWorldX & -2);
// 480 SD mode - y needs to be on a pixel boundary when multiplied by 1.5, so if it's an odd number, subtract 1/3 from it
int iWorldY=pWorldViewProj->_42;
if(iWorldY%2==1)
{
pWorldViewProj->_42-=1.0f/3.0f;
}
}
}
g_pD3DDevice->GetVertexShaderConstantF( 0, (float *)vconsts, 20 );
g_pD3DDevice->GetPixelShaderConstantF( 0, (float *)pconsts, 20 );
g_pD3DDevice->SetRenderState(D3DRS_HALFPIXELOFFSET, TRUE);
GetRenderAndSamplerStates(g_pD3DDevice, RenderStateA, SamplerStateA );
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
RenderManager.Set_matrixDirty();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 1280.0f, 720.0f, 0, 1000, 3000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0, 0, -2000);
glColor4f(1.0f,1.0f,1.0f,1.0f);
float matrixCopy[16];
memcpy(matrixCopy, pWorldViewProj, 64);
matrixCopy[11] = 0.0f;
matrixCopy[12] = floor(matrixCopy[12] + 0.5f);
matrixCopy[13] = floor(matrixCopy[13] + 0.5f);
matrixCopy[14] = floor(matrixCopy[14] + 0.5f);
matrixCopy[15] = 1.0f;
glMultMatrixf(matrixCopy);
float lineXPos = 0.0f;
float lineYPos = 0.0f;
DWORD colour = 0;
DWORD style = 0;
#if 1
for( int i = 0; i < dwCount; i++ )
{
wstring string;
string.push_back(pCharData[i].wch);
lineYPos = pCharData[i].y;
lineXPos = pCharData[i].x;
colour = pCharData[i].dwColor;
style = pCharData[i].dwStyle;
//if(pCharData[i].wch > font->m_fontData->getMaxGlyph())
if ( !font->m_fontData->getChar(pCharData[i].wch).hasChar() )
{
// Can't render this character, fallback to the default renderer
app.OverrideFontRenderer(false,false);
break;
}
#else
DWORD i = 0;
while( i < dwCount )
{
wstring string;
lineYPos = pCharData[i].y;
lineXPos = pCharData[i].x;
colour = pCharData[i].dwColor;
style = pCharData[i].dwStyle;
while(i < dwCount && pCharData[i].y == lineYPos)
{
string.push_back(pCharData[i].wch);
++i;
}
#endif
bool dropShadow = false;
if( (style & XUI_FONT_STYLE_DROPSHADOW) == XUI_FONT_STYLE_DROPSHADOW) dropShadow = true;
//int yPos = (int)pCharData[i].y + (int)(font->m_fontMetrics.fLineHeight - font->m_fontMetrics.fMaxAscent)/2;
//if( (pCharData[i].dwStyle & XUI_FONT_STYLE_VERTICAL_CENTER) == XUI_FONT_STYLE_VERTICAL_CENTER)
//{
// yPos = (pClipRect->bottom - (int)font->m_fontMetrics.fLineHeight) / 2;
//}
if(dropShadow)
{
DWORD shadowColour;
XuiGetTextDropShadowColor(hDC, &shadowColour);
// 4J Stu - Shadow colour is currently ignored
font->DrawShadowText( lineXPos,lineYPos,colour,shadowColour,string.c_str() );
//drawShadow(thisChar, (int)pCharData[i].x, yPos, pCharData[i].dwColor );
}
else
{
font->DrawText( lineXPos,lineYPos,colour,string.c_str() );
//draw(thisChar, (int)pCharData[i].x, yPos, pCharData[i].dwColor, false );
}
}
g_pD3DDevice->SetVertexShaderConstantF( 0, (float *)vconsts, 20 );
g_pD3DDevice->SetPixelShaderConstantF( 0, (float *)pconsts, 20 );
SetRenderAndSamplerStates(g_pD3DDevice, RenderStateA, SamplerStateA );
g_pD3DDevice->SetRenderState(D3DRS_HALFPIXELOFFSET, FALSE);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
XuiRenderRestoreState(hDC);
return( S_OK );
}

View File

@@ -0,0 +1,49 @@
#pragma once
using namespace std;
class XUI_FontData;
class XUI_Font;
// Define this to use this class as the XUI font renderer
#define OVERRIDE_XUI_FONT_RENDERER
//#define USE_SCALING_FONT
class XUI_FontRenderer : public IXuiFontRenderer
{
protected:
enum eFontData
{
eFontData_MIN = 0,
eFontData_Mojangles_7 = 0,
eFontData_Mojangles_11,
eFontData_MAX
};
// The font data is the image and size/coords data
XUI_FontData *m_loadedFontData[eFontData_MAX];
// The XUI_Font is a temporary instance that is around as long as XUI needs it, but does the actual rendering
// These can be chained
unordered_map<float, XUI_Font *> m_loadedFonts[eFontData_MAX];
public:
XUI_FontRenderer();
// 4J - IXuiFontRenderer interface
virtual HRESULT STDMETHODCALLTYPE Init( float fDpi );
virtual VOID STDMETHODCALLTYPE Term();
virtual HRESULT STDMETHODCALLTYPE GetCaps( DWORD * pdwCaps );
virtual HRESULT STDMETHODCALLTYPE CreateFont( const TypefaceDescriptor * pTypefaceDescriptor,
float fPointSize, DWORD dwStyle, DWORD dwReserved, HFONTOBJ * phFont );
virtual VOID STDMETHODCALLTYPE ReleaseFont( HFONTOBJ hFont );
virtual HRESULT STDMETHODCALLTYPE GetFontMetrics( HFONTOBJ hFont, XUIFontMetrics *pFontMetrics );
virtual HRESULT STDMETHODCALLTYPE GetCharMetrics( HFONTOBJ hFont, WCHAR wch,
XUICharMetrics *pCharMetrics );
virtual HRESULT STDMETHODCALLTYPE DrawCharToTexture( HFONTOBJ hFont, WCHAR wch, HXUIDC hDC,
IXuiTexture * pTexture, UINT x, UINT y, UINT width, UINT height,
UINT insetX, UINT insetY );
virtual HRESULT STDMETHODCALLTYPE DrawCharsToDevice( HFONTOBJ hFont, CharData * pCharData,
DWORD dwCount, RECT *pClipRect, HXUIDC hDC,
D3DXMATRIX * pWorldViewProj );
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,668 @@
////////////////////////////////////////////////////////////////////
//
// C:\Work\4J\Mojang\Minecraft\Minecraft360-dev\Minecraft.Client\Xbox\GameConfig\Minecraft.spa.h
//
// Auto-generated on Thursday, 10 May 2012 at 21:23:22
// Xbox LIVE Game Config project version 1.0.173.0
// SPA Compiler version 1.0.0.0
//
////////////////////////////////////////////////////////////////////
#ifndef __MINECRAFT_SPA_H__
#define __MINECRAFT_SPA_H__
#ifdef __cplusplus
extern "C" {
#endif
//
// Title info
//
#define TITLEID_MINECRAFT 0x584111F7
//
// Context ids
//
// These values are passed as the dwContextId to XUserSetContext.
//
#define CONTEXT_GAME_STATE 0
//
// Context values
//
// These values are passed as the dwContextValue to XUserSetContext.
//
// Values for CONTEXT_GAME_STATE
#define CONTEXT_GAME_STATE_BLANK 0
#define CONTEXT_GAME_STATE_RIDING_PIG 1
#define CONTEXT_GAME_STATE_RIDING_MINECART 2
#define CONTEXT_GAME_STATE_BOATING 3
#define CONTEXT_GAME_STATE_FISHING 4
#define CONTEXT_GAME_STATE_CRAFTING 5
#define CONTEXT_GAME_STATE_FORGING 6
#define CONTEXT_GAME_STATE_NETHER 7
#define CONTEXT_GAME_STATE_CD 8
#define CONTEXT_GAME_STATE_MAP 9
#define CONTEXT_GAME_STATE_ENCHANTING 5 //TODO 10
#define CONTEXT_GAME_STATE_BREWING 5 //TODO 11
#define CONTEXT_GAME_STATE_ANVIL 6 //TODO 12
#define CONTEXT_GAME_STATE_TRADING 0 //TODO 13
// Values for X_CONTEXT_PRESENCE
#define CONTEXT_PRESENCE_IDLE 0
#define CONTEXT_PRESENCE_MENUS 1
#define CONTEXT_PRESENCE_MULTIPLAYER 2
#define CONTEXT_PRESENCE_MULTIPLAYEROFFLINE 3
#define CONTEXT_PRESENCE_MULTIPLAYER_1P 4
#define CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE 5
// Values for X_CONTEXT_GAME_MODE
#define CONTEXT_GAME_MODE_GAMEMODE 0
#define CONTEXT_GAME_MODE_MULTIPLAYER 1
//
// Property ids
//
// These values are passed as the dwPropertyId value to XUserSetProperty
// and as the dwPropertyId value in the XUSER_PROPERTY structure.
//
#define PROPERTY_LOCALE 0x10000008
#define PROPERTY_KILLS_ZOMBIE 0x1000000A
#define PROPERTY_KILLS_SKELETON 0x1000000B
#define PROPERTY_KILLS_CREEPER 0x1000000C
#define PROPERTY_KILLS_SPIDER 0x1000000D
#define PROPERTY_KILLS_SPIDERJOCKEY 0x1000000E
#define PROPERTY_KILLS_ZOMBIEPIGMAN 0x1000000F
#define PROPERTY_KILLS_SLIME 0x10000010
#define PROPERTY_KILLS_GHAST 0x10000011
#define PROPERTY_MINED_DIRT 0x10000012
#define PROPERTY_MINED_STONE 0x10000013
#define PROPERTY_MINED_SAND 0x10000014
#define PROPERTY_MINED_COBBLESTONE 0x10000015
#define PROPERTY_MINED_GRAVEL 0x10000016
#define PROPERTY_MINED_CLAY 0x10000017
#define PROPERTY_MINED_OBSIDIAN 0x10000018
#define PROPERTY_MINED_COAL 0x10000019
#define PROPERTY_MINED_IRON 0x1000001A
#define PROPERTY_MINED_GOLD 0x1000001B
#define PROPERTY_MINED_DIAMOND 0x1000001C
#define PROPERTY_MINED_REDSTONE 0x1000001D
#define PROPERTY_MINED_LAPISLAZULI 0x1000001E
#define PROPERTY_MINED_NETHERRACK 0x1000001F
#define PROPERTY_MINED_SOULSAND 0x10000020
#define PROPERTY_MINED_GLOWSTONE 0x10000021
#define PROPERTY_COLLECTED_EGG 0x10000022
#define PROPERTY_COLLECTED_WHEAT 0x10000023
#define PROPERTY_COLLECTED_MUSHROOM 0x10000024
#define PROPERTY_COLLECTED_SUGARCANE 0x10000025
#define PROPERTY_COLLECTED_MILK 0x10000026
#define PROPERTY_COLLECTED_PUMPKIN 0x10000027
#define PROPERTY_TRAVEL_WALK 0x10000028
#define PROPERTY_TRAVEL_SWIM 0x10000029
#define PROPERTY_TRAVEL_FALL 0x1000002A
#define PROPERTY_TRAVEL_CLIMB 0x1000002B
#define PROPERTY_TRAVEL_MINECART 0x1000002C
#define PROPERTY_TRAVEL_BOAT 0x1000002D
#define PROPERTY_PORTALS_CREATED 0x1000002F
#define PROPERTY_COLLECTED_NETHERLAVA 0x10000030
#define PROPERTY_RATING 0x20000009
//
// Achievement ids
//
// These values are used in the dwAchievementId member of the
// XUSER_ACHIEVEMENT structure that is used with
// XUserWriteAchievements and XUserCreateAchievementEnumerator.
//
#define ACHIEVEMENT_01 1
#define ACHIEVEMENT_02 2
#define ACHIEVEMENT_03 3
#define ACHIEVEMENT_04 4
#define ACHIEVEMENT_05 5
#define ACHIEVEMENT_06 6
#define ACHIEVEMENT_07 7
#define ACHIEVEMENT_08 8
#define ACHIEVEMENT_09 9
#define ACHIEVEMENT_10 10
#define ACHIEVEMENT_11 11
#define ACHIEVEMENT_12 12
#define ACHIEVEMENT_13 14
#define ACHIEVEMENT_14 15
#define ACHIEVEMENT_15 16
#define ACHIEVEMENT_16 17
#define ACHIEVEMENT_17 18
#define ACHIEVEMENT_18 19
#define ACHIEVEMENT_19 20
#define ACHIEVEMENT_20 21
//
// AvatarAssetAward ids
//
#define AVATARASSETAWARD_PORKCHOP_TSHIRT 1
#define AVATARASSETAWARD_WATCH 2
#define AVATARASSETAWARD_CAP 5
//
// Stats view ids
//
// These are used in the dwViewId member of the XUSER_STATS_SPEC structure
// passed to the XUserReadStats* and XUserCreateStatsEnumerator* functions.
//
// Skill leaderboards for ranked game modes
#define STATS_VIEW_SKILL_RANKED_GAMEMODE 0xFFFF0000
#define STATS_VIEW_SKILL_RANKED_MULTIPLAYER 0xFFFF0001
// Skill leaderboards for unranked (standard) game modes
#define STATS_VIEW_SKILL_STANDARD_GAMEMODE 0xFFFE0000
#define STATS_VIEW_SKILL_STANDARD_MULTIPLAYER 0xFFFE0001
// Title defined leaderboards
#define STATS_VIEW_KILLS_EASY 4
#define STATS_VIEW_KILLS_NORMAL 5
#define STATS_VIEW_KILLS_HARD 6
#define STATS_VIEW_MINING_BLOCKS_PEACEFUL 7
#define STATS_VIEW_MINING_BLOCKS_EASY 8
#define STATS_VIEW_MINING_BLOCKS_NORMAL 9
#define STATS_VIEW_MINING_BLOCKS_HARD 10
#define STATS_VIEW_FARMING_PEACEFUL 15
#define STATS_VIEW_FARMING_EASY 16
#define STATS_VIEW_FARMING_NORMAL 17
#define STATS_VIEW_FARMING_HARD 18
#define STATS_VIEW_TRAVELLING_PEACEFUL 19
#define STATS_VIEW_TRAVELLING_EASY 20
#define STATS_VIEW_TRAVELLING_NORMAL 21
#define STATS_VIEW_TRAVELLING_HARD 22
#define STATS_VIEW_TRAVELLING_TOTAL 27
//
// Stats view column ids
//
// These ids are used to read columns of stats views. They are specified in
// the rgwColumnIds array of the XUSER_STATS_SPEC structure. Rank, rating
// and gamertag are not retrieved as custom columns and so are not included
// in the following definitions. They can be retrieved from each row's
// header (e.g., pStatsResults->pViews[x].pRows[y].dwRank, etc.).
//
// Column ids for KILLS_EASY
#define STATS_COLUMN_KILLS_EASY_LOCALE 9
#define STATS_COLUMN_KILLS_EASY_ZOMBIES 1
#define STATS_COLUMN_KILLS_EASY_SKELETONS 2
#define STATS_COLUMN_KILLS_EASY_CREEPERS 3
#define STATS_COLUMN_KILLS_EASY_SPIDERS 4
#define STATS_COLUMN_KILLS_EASY_SPIDERJOCKEYS 5
#define STATS_COLUMN_KILLS_EASY_ZOMBIEPIGMEN 6
#define STATS_COLUMN_KILLS_EASY_SLIME 7
// Column ids for KILLS_NORMAL
#define STATS_COLUMN_KILLS_NORMAL_LOCALE 9
#define STATS_COLUMN_KILLS_NORMAL_ZOMBIES 1
#define STATS_COLUMN_KILLS_NORMAL_SKELETONS 2
#define STATS_COLUMN_KILLS_NORMAL_CREEPERS 3
#define STATS_COLUMN_KILLS_NORMAL_SPIDERS 4
#define STATS_COLUMN_KILLS_NORMAL_SPIDERJOCKEYS 5
#define STATS_COLUMN_KILLS_NORMAL_ZOMBIEPIGMEN 6
#define STATS_COLUMN_KILLS_NORMAL_SLIME 7
// Column ids for KILLS_HARD
#define STATS_COLUMN_KILLS_HARD_LOCALE 9
#define STATS_COLUMN_KILLS_HARD_ZOMBIES 1
#define STATS_COLUMN_KILLS_HARD_SKELETONS 2
#define STATS_COLUMN_KILLS_HARD_CREEPERS 3
#define STATS_COLUMN_KILLS_HARD_SPIDERS 4
#define STATS_COLUMN_KILLS_HARD_SPIDERJOCKEYS 5
#define STATS_COLUMN_KILLS_HARD_ZOMBIEPIGMEN 6
#define STATS_COLUMN_KILLS_HARD_SLIME 7
// Column ids for MINING_BLOCKS_PEACEFUL
#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_LOCALE 1
#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_DIRT 2
#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_STONE 3
#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_SAND 4
#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_COBBLESTONE 5
#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_GRAVEL 6
#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_CLAY 7
#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_OBSIDIAN 8
// Column ids for MINING_BLOCKS_EASY
#define STATS_COLUMN_MINING_BLOCKS_EASY_LOCALE 1
#define STATS_COLUMN_MINING_BLOCKS_EASY_DIRT 2
#define STATS_COLUMN_MINING_BLOCKS_EASY_STONE 3
#define STATS_COLUMN_MINING_BLOCKS_EASY_SAND 4
#define STATS_COLUMN_MINING_BLOCKS_EASY_COBBLESTONE 5
#define STATS_COLUMN_MINING_BLOCKS_EASY_GRAVEL 6
#define STATS_COLUMN_MINING_BLOCKS_EASY_CLAY 7
#define STATS_COLUMN_MINING_BLOCKS_EASY_OBSIDIAN 8
// Column ids for MINING_BLOCKS_NORMAL
#define STATS_COLUMN_MINING_BLOCKS_NORMAL_LOCALE 1
#define STATS_COLUMN_MINING_BLOCKS_NORMAL_DIRT 2
#define STATS_COLUMN_MINING_BLOCKS_NORMAL_STONE 3
#define STATS_COLUMN_MINING_BLOCKS_NORMAL_SAND 4
#define STATS_COLUMN_MINING_BLOCKS_NORMAL_COBBLESTONE 5
#define STATS_COLUMN_MINING_BLOCKS_NORMAL_GRAVEL 6
#define STATS_COLUMN_MINING_BLOCKS_NORMAL_CLAY 7
#define STATS_COLUMN_MINING_BLOCKS_NORMAL_OBSIDIAN 8
// Column ids for MINING_BLOCKS_HARD
#define STATS_COLUMN_MINING_BLOCKS_HARD_LOCALE 1
#define STATS_COLUMN_MINING_BLOCKS_HARD_DIRT 2
#define STATS_COLUMN_MINING_BLOCKS_HARD_STONE 3
#define STATS_COLUMN_MINING_BLOCKS_HARD_SAND 4
#define STATS_COLUMN_MINING_BLOCKS_HARD_COBBLESTONE 5
#define STATS_COLUMN_MINING_BLOCKS_HARD_GRAVEL 6
#define STATS_COLUMN_MINING_BLOCKS_HARD_CLAY 7
#define STATS_COLUMN_MINING_BLOCKS_HARD_OBSIDIAN 8
// Column ids for FARMING_PEACEFUL
#define STATS_COLUMN_FARMING_PEACEFUL_LOCALE 1
#define STATS_COLUMN_FARMING_PEACEFUL_EGGS 2
#define STATS_COLUMN_FARMING_PEACEFUL_WHEAT 3
#define STATS_COLUMN_FARMING_PEACEFUL_MUSHROOMS 4
#define STATS_COLUMN_FARMING_PEACEFUL_SUGARCANE 5
#define STATS_COLUMN_FARMING_PEACEFUL_MILK 6
#define STATS_COLUMN_FARMING_PEACEFUL_PUMPKINS 7
// Column ids for FARMING_EASY
#define STATS_COLUMN_FARMING_EASY_LOCALE 1
#define STATS_COLUMN_FARMING_EASY_EGGS 2
#define STATS_COLUMN_FARMING_EASY_WHEAT 3
#define STATS_COLUMN_FARMING_EASY_MUSHROOMS 4
#define STATS_COLUMN_FARMING_EASY_SUGARCANE 5
#define STATS_COLUMN_FARMING_EASY_MILK 6
#define STATS_COLUMN_FARMING_EASY_PUMPKINS 7
// Column ids for FARMING_NORMAL
#define STATS_COLUMN_FARMING_NORMAL_LOCALE 1
#define STATS_COLUMN_FARMING_NORMAL_EGGS 2
#define STATS_COLUMN_FARMING_NORMAL_WHEAT 3
#define STATS_COLUMN_FARMING_NORMAL_MUSHROOMS 4
#define STATS_COLUMN_FARMING_NORMAL_SUGARCANE 5
#define STATS_COLUMN_FARMING_NORMAL_MILK 6
#define STATS_COLUMN_FARMING_NORMAL_PUMPKINS 7
// Column ids for FARMING_HARD
#define STATS_COLUMN_FARMING_HARD_LOCALE 1
#define STATS_COLUMN_FARMING_HARD_EGGS 2
#define STATS_COLUMN_FARMING_HARD_WHEAT 3
#define STATS_COLUMN_FARMING_HARD_MUSHROOMS 4
#define STATS_COLUMN_FARMING_HARD_SUGARCANE 5
#define STATS_COLUMN_FARMING_HARD_MILK 6
#define STATS_COLUMN_FARMING_HARD_PUMPKINS 7
// Column ids for TRAVELLING_PEACEFUL
#define STATS_COLUMN_TRAVELLING_PEACEFUL_LOCALE 1
#define STATS_COLUMN_TRAVELLING_PEACEFUL_WALKED 2
#define STATS_COLUMN_TRAVELLING_PEACEFUL_SWAM 3
#define STATS_COLUMN_TRAVELLING_PEACEFUL_FALLEN 4
#define STATS_COLUMN_TRAVELLING_PEACEFUL_CLIMBED 5
#define STATS_COLUMN_TRAVELLING_PEACEFUL_MINECART 6
#define STATS_COLUMN_TRAVELLING_PEACEFUL_BOAT 7
// Column ids for TRAVELLING_EASY
#define STATS_COLUMN_TRAVELLING_EASY_LOCALE 1
#define STATS_COLUMN_TRAVELLING_EASY_WALKED 2
#define STATS_COLUMN_TRAVELLING_EASY_SWAM 3
#define STATS_COLUMN_TRAVELLING_EASY_FALLEN 4
#define STATS_COLUMN_TRAVELLING_EASY_CLIMBED 5
#define STATS_COLUMN_TRAVELLING_EASY_MINECART 6
#define STATS_COLUMN_TRAVELLING_EASY_BOAT 7
// Column ids for TRAVELLING_NORMAL
#define STATS_COLUMN_TRAVELLING_NORMAL_LOCALE 1
#define STATS_COLUMN_TRAVELLING_NORMAL_WALKED 2
#define STATS_COLUMN_TRAVELLING_NORMAL_SWAM 3
#define STATS_COLUMN_TRAVELLING_NORMAL_FALLEN 4
#define STATS_COLUMN_TRAVELLING_NORMAL_CLIMBED 5
#define STATS_COLUMN_TRAVELLING_NORMAL_MINECART 6
#define STATS_COLUMN_TRAVELLING_NORMAL_BOAT 7
// Column ids for TRAVELLING_HARD
#define STATS_COLUMN_TRAVELLING_HARD_LOCALE 1
#define STATS_COLUMN_TRAVELLING_HARD_WALKED 2
#define STATS_COLUMN_TRAVELLING_HARD_SWAM 3
#define STATS_COLUMN_TRAVELLING_HARD_FALLEN 4
#define STATS_COLUMN_TRAVELLING_HARD_CLIMBED 5
#define STATS_COLUMN_TRAVELLING_HARD_MINECART 6
#define STATS_COLUMN_TRAVELLING_HARD_BOAT 7
// Column ids for TRAVELLING_TOTAL
//
// Matchmaking queries
//
// These values are passed as the dwProcedureIndex parameter to
// XSessionSearch to indicate which matchmaking query to run.
//
#define SESSION_MATCH_QUERY_FRIENDS 0
//
// Gamer pictures
//
// These ids are passed as the dwPictureId parameter to XUserAwardGamerTile.
//
#define GAMER_PICTURE_GAMERPIC1 12
#define GAMER_PICTURE_GAMERPIC2 13
//
// Strings
//
// These ids are passed as the dwStringId parameter to XReadStringsFromSpaFile.
//
#define SPASTRING_PRESENCE_IDLE_NAME 4
#define SPASTRING_PRESENCE_MENUS_NAME 10
#define SPASTRING_ACH_01_NAME 376
#define SPASTRING_ACH_02_NAME 377
#define SPASTRING_ACH_03_NAME 378
#define SPASTRING_ACH_07_NAME 379
#define SPASTRING_ACH_08_NAME 380
#define SPASTRING_ACH_09_NAME 381
#define SPASTRING_ACH_13_NAME 382
#define SPASTRING_ACH_14_NAME 383
#define SPASTRING_ACH_15_NAME 384
#define SPASTRING_ACH_16_NAME 385
#define SPASTRING_ACH_04_NAME 386
#define SPASTRING_ACH_10_NAME 387
#define SPASTRING_ACH_01_DESC 388
#define SPASTRING_ACH_02_DESC 389
#define SPASTRING_ACH_03_DESC 390
#define SPASTRING_ACH_07_DESC 391
#define SPASTRING_ACH_08_DESC 392
#define SPASTRING_ACH_09_DESC 393
#define SPASTRING_ACH_13_DESC 394
#define SPASTRING_ACH_14_DESC 395
#define SPASTRING_ACH_15_DESC 396
#define SPASTRING_ACH_16_DESC 397
#define SPASTRING_ACH_04_DESC 398
#define SPASTRING_ACH_10_DESC 399
#define SPASTRING_ACH_01_HOWTO 400
#define SPASTRING_ACH_02_HOWTO 401
#define SPASTRING_ACH_03_HOWTO 402
#define SPASTRING_ACH_07_HOWTO 403
#define SPASTRING_ACH_08_HOWTO 404
#define SPASTRING_ACH_09_HOWTO 405
#define SPASTRING_ACH_13_HOWTO 406
#define SPASTRING_ACH_14_HOWTO 407
#define SPASTRING_ACH_15_HOWTO 408
#define SPASTRING_ACH_16_HOWTO 409
#define SPASTRING_ACH_04_HOWTO 410
#define SPASTRING_ACH_10_HOWTO 411
#define SPASTRING_STR_GAMEMODE_SINGLEPLAYER 420
#define SPASTRING_ACH_05_HOWTO 429
#define SPASTRING_ACH_05_NAME 430
#define SPASTRING_ACH_05_DESC 431
#define SPASTRING_ACH_11_HOWTO 432
#define SPASTRING_ACH_11_NAME 433
#define SPASTRING_ACH_11_DESC 434
#define SPASTRING_ACH_06_HOWTO 435
#define SPASTRING_ACH_06_NAME 436
#define SPASTRING_ACH_06_DESC 437
#define SPASTRING_ACH_12_HOWTO 438
#define SPASTRING_ACH_12_NAME 439
#define SPASTRING_ACH_12_DESC 440
#define SPASTRING_ACH_17_HOWTO 441
#define SPASTRING_ACH_17_NAME 442
#define SPASTRING_ACH_17_DESC 443
#define SPASTRING_ACH_18_HOWTO 444
#define SPASTRING_ACH_18_NAME 445
#define SPASTRING_ACH_18_DESC 446
#define SPASTRING_ACH_19_HOWTO 447
#define SPASTRING_ACH_19_NAME 448
#define SPASTRING_ACH_19_DESC 449
#define SPASTRING_ACH_20_HOWTO 450
#define SPASTRING_ACH_20_NAME 451
#define SPASTRING_ACH_20_DESC 452
#define SPASTRING_AV_PORKCHOP_TSHIRT_HOWTO 473
#define SPASTRING_AV_PORKCHOP_TSHIRT_TITLE1 474
#define SPASTRING_AV_PORKCHOP_TSHIRT_TITLE2 475
#define SPASTRING_AV_PORKCHOP_TSHIRT_DESC 476
#define SPASTRING_AV_WATCH_HOWTO 477
#define SPASTRING_AV_WATCH_TITLE1 478
#define SPASTRING_AV_WATCH_TITLE2 479
#define SPASTRING_AV_WATCH_DESC 480
#define SPASTRING_PRESENCE_MULTIPLAYER_NAME 490
#define SPASTRING_CT_GAME_STATE_NAME 492
#define SPASTRING_CV_GAME_STATE_BLANK_NAME 496
#define SPASTRING_CV_GAME_STATE_RIDING_PIG_NAME 497
#define SPASTRING_CV_GAME_STATE_RIDING_MINECART_NAME 498
#define SPASTRING_CV_GAME_STATE_BOATING_NAME 499
#define SPASTRING_CV_GAME_STATE_FISHING_NAME 500
#define SPASTRING_CV_GAME_STATE_CRAFTING_NAME 501
#define SPASTRING_CV_GAME_STATE_FORGING_NAME 502
#define SPASTRING_CV_GAME_STATE_NETHER_NAME 503
#define SPASTRING_CV_GAME_STATE_CD_NAME 504
#define SPASTRING_CV_GAME_STATE_MAP_NAME 505
#define SPASTRING_AV_CAP_HOWTO 506
#define SPASTRING_AV_CAP_TITLE1 507
#define SPASTRING_AV_CAP_TITLE2 508
#define SPASTRING_AV_CAP_DESC 509
#define SPASTRING_GM_MULTIPLAYER_NAME 517
#define SPASTRING_PROPERTY_LOCALE_NAME 520
#define SPASTRING_LB_KILLS_EASY_NAME 523
#define SPASTRING_LB_KILLS_EASY_ZOMBIES_NAME 524
#define SPASTRING_LB_KILLS_EASY_SKELETONS_NAME 525
#define SPASTRING_LB_KILLS_EASY_CREEPERS_NAME 526
#define SPASTRING_LB_KILLS_EASY_SPIDERS_NAME 527
#define SPASTRING_LB_KILLS_EASY_SPIDERJOCKEYS_NAME 528
#define SPASTRING_LB_KILLS_EASY_ZOMBIEPIGMEN_NAME 529
#define SPASTRING_LB_KILLS_EASY_SLIME_NAME 530
#define SPASTRING_LB_KILLS_EASY_RATING_NAME 531
#define SPASTRING_PROPERTY_RATING_NAME 532
#define SPASTRING_LB_KILLS_EASY_LOCALE_NAME 533
#define SPASTRING_PROPERTY_KILLS_ZOMBIE_NAME 534
#define SPASTRING_PROPERTY_KILLS_SKELETON_NAME 535
#define SPASTRING_PROPERTY_KILLS_CREEPER_NAME 536
#define SPASTRING_PROPERTY_KILLS_SPIDER_NAME 537
#define SPASTRING_PROPERTY_KILLS_SPIDERJOCKEY_NAME 538
#define SPASTRING_PROPERTY_KILLS_ZOMBIEPIGMAN_NAME 539
#define SPASTRING_PROPERTY_KILLS_SLIME_NAME 540
#define SPASTRING_PROPERTY_KILLS_GHAST_NAME 541
#define SPASTRING_LB_KILLS_NORMAL_NAME 543
#define SPASTRING_LB_KILLS_NORMAL_LOCALE_NAME 544
#define SPASTRING_LB_KILLS_NORMAL_ZOMBIES_NAME 545
#define SPASTRING_LB_KILLS_NORMAL_SKELETONS_NAME 546
#define SPASTRING_LB_KILLS_NORMAL_CREEPERS_NAME 547
#define SPASTRING_LB_KILLS_NORMAL_SPIDERS_NAME 548
#define SPASTRING_LB_KILLS_NORMAL_SPIDERJOCKEYS_NAME 549
#define SPASTRING_LB_KILLS_NORMAL_ZOMBIEPIGMEN_NAME 550
#define SPASTRING_LB_KILLS_NORMAL_SLIME_NAME 551
#define SPASTRING_LB_KILLS_NORMAL_RATING_NAME 552
#define SPASTRING_LB_KILLS_HARD_NAME 554
#define SPASTRING_LB_KILLS_HARD_LOCALE_NAME 555
#define SPASTRING_LB_KILLS_HARD_ZOMBIES_NAME 556
#define SPASTRING_LB_KILLS_HARD_SKELETONS_NAME 557
#define SPASTRING_LB_KILLS_HARD_CREEPERS_NAME 558
#define SPASTRING_LB_KILLS_HARD_SPIDERS_NAME 559
#define SPASTRING_LB_KILLS_HARD_SPIDERJOCKEYS_NAME 560
#define SPASTRING_LB_KILLS_HARD_ZOMBIEPIGMEN_NAME 561
#define SPASTRING_LB_KILLS_HARD_SLIME_NAME 562
#define SPASTRING_LB_KILLS_HARD_RATING_NAME 563
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_NAME 564
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_LOCALE_NAME 565
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_DIRT_NAME 566
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_STONE_NAME 567
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_SAND_NAME 568
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_COBBLESTONE_NAME 569
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_GRAVEL_NAME 570
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_CLAY_NAME 571
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_OBSIDIAN_NAME 572
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_RATING_NAME 573
#define SPASTRING_PROPERTY_MINED_DIRT_NAME 574
#define SPASTRING_PROPERTY_MINED_STONE_NAME 575
#define SPASTRING_PROPERTY_MINED_SAND_NAME 576
#define SPASTRING_PROPERTY_MINED_COBBLESTONE_NAME 577
#define SPASTRING_PROPERTY_MINED_GRAVEL_NAME 578
#define SPASTRING_PROPERTY_MINED_CLAY_NAME 579
#define SPASTRING_PROPERTY_MINED_OBSIDIAN_NAME 580
#define SPASTRING_PROPERTY_MINED_COAL_NAME 581
#define SPASTRING_PROPERTY_MINED_IRON_NAME 582
#define SPASTRING_PROPERTY_MINED_GOLD_NAME 583
#define SPASTRING_PROPERTY_MINED_DIAMOND_NAME 584
#define SPASTRING_PROPERTY_MINED_REDSTONE_NAME 585
#define SPASTRING_PROPERTY_MINED_LAPISLAZULI_NAME 586
#define SPASTRING_PROPERTY_MINED_NETHERRACK_NAME 587
#define SPASTRING_PROPERTY_MINED_SOULSAND_NAME 588
#define SPASTRING_PROPERTY_MINED_GLOWSTONE_NAME 589
#define SPASTRING_PROPERTY_COLLECTED_EGG_NAME 590
#define SPASTRING_PROPERTY_COLLECTED_WHEAT_NAME 591
#define SPASTRING_PROPERTY_COLLECTED_MUSHROOM_NAME 592
#define SPASTRING_PROPERTY_COLLECTED_SUGARCANE_NAME 593
#define SPASTRING_PROPERTY_COLLECTED_MILK_NAME 594
#define SPASTRING_PROPERTY_COLLECTED_PUMPKIN_NAME 595
#define SPASTRING_PROPERTY_TRAVEL_WALK_NAME 596
#define SPASTRING_PROPERTY_TRAVEL_SWIM_NAME 597
#define SPASTRING_PROPERTY_TRAVEL_FALL_NAME 598
#define SPASTRING_PROPERTY_TRAVEL_CLIMB_NAME 599
#define SPASTRING_PROPERTY_TRAVEL_MINECART_NAME 600
#define SPASTRING_PROPERTY_TRAVEL_BOAT_NAME 601
#define SPASTRING_PROPERTY_PORTALS_CREATED_NAME 603
#define SPASTRING_LB_MINING_BLOCKS_EASY_NAME 605
#define SPASTRING_LB_MINING_BLOCKS_EASY_LOCALE_NAME 606
#define SPASTRING_LB_MINING_BLOCKS_EASY_DIRT_NAME 607
#define SPASTRING_LB_MINING_BLOCKS_EASY_STONE_NAME 608
#define SPASTRING_LB_MINING_BLOCKS_EASY_SAND_NAME 609
#define SPASTRING_LB_MINING_BLOCKS_EASY_COBBLESTONE_NAME 610
#define SPASTRING_LB_MINING_BLOCKS_EASY_GRAVEL_NAME 611
#define SPASTRING_LB_MINING_BLOCKS_EASY_CLAY_NAME 612
#define SPASTRING_LB_MINING_BLOCKS_EASY_OBSIDIAN_NAME 613
#define SPASTRING_LB_MINING_BLOCKS_EASY_RATING_NAME 614
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_NAME 616
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_LOCALE_NAME 617
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_DIRT_NAME 618
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_STONE_NAME 619
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_SAND_NAME 620
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_COBBLESTONE_NAME 621
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_GRAVEL_NAME 622
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_CLAY_NAME 623
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_OBSIDIAN_NAME 624
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_RATING_NAME 625
#define SPASTRING_LB_MINING_BLOCKS_HARD_NAME 627
#define SPASTRING_LB_MINING_BLOCKS_HARD_LOCALE_NAME 628
#define SPASTRING_LB_MINING_BLOCKS_HARD_DIRT_NAME 629
#define SPASTRING_LB_MINING_BLOCKS_HARD_STONE_NAME 630
#define SPASTRING_LB_MINING_BLOCKS_HARD_SAND_NAME 631
#define SPASTRING_LB_MINING_BLOCKS_HARD_COBBLESTONE_NAME 632
#define SPASTRING_LB_MINING_BLOCKS_HARD_GRAVEL_NAME 633
#define SPASTRING_LB_MINING_BLOCKS_HARD_CLAY_NAME 634
#define SPASTRING_LB_MINING_BLOCKS_HARD_OBSIDIAN_NAME 635
#define SPASTRING_LB_MINING_BLOCKS_HARD_RATING_NAME 636
#define SPASTRING_LB_FARMING_PEACEFUL_NAME 676
#define SPASTRING_LB_FARMING_PEACEFUL_LOCALE_NAME 677
#define SPASTRING_LB_FARMING_PEACEFUL_EGGS_NAME 678
#define SPASTRING_LB_FARMING_PEACEFUL_WHEAT_NAME 679
#define SPASTRING_LB_FARMING_PEACEFUL_MUSHROOMS_NAME 680
#define SPASTRING_LB_FARMING_PEACEFUL_SUGARCANE_NAME 681
#define SPASTRING_LB_FARMING_PEACEFUL_MILK_NAME 682
#define SPASTRING_LB_FARMING_PEACEFUL_PUMPKINS_NAME 683
#define SPASTRING_LB_FARMING_PEACEFUL_RATING_NAME 684
#define SPASTRING_LB_FARMING_EASY_NAME 686
#define SPASTRING_LB_FARMING_EASY_LOCALE_NAME 687
#define SPASTRING_LB_FARMING_EASY_EGGS_NAME 688
#define SPASTRING_LB_FARMING_EASY_WHEAT_NAME 689
#define SPASTRING_LB_FARMING_EASY_MUSHROOMS_NAME 690
#define SPASTRING_LB_FARMING_EASY_SUGARCANE_NAME 691
#define SPASTRING_LB_FARMING_EASY_MILK_NAME 692
#define SPASTRING_LB_FARMING_EASY_PUMPKINS_NAME 693
#define SPASTRING_LB_FARMING_EASY_RATING_NAME 694
#define SPASTRING_LB_FARMING_NORMAL_NAME 696
#define SPASTRING_LB_FARMING_NORMAL_LOCALE_NAME 697
#define SPASTRING_LB_FARMING_NORMAL_EGGS_NAME 698
#define SPASTRING_LB_FARMING_NORMAL_WHEAT_NAME 699
#define SPASTRING_LB_FARMING_NORMAL_MUSHROOMS_NAME 700
#define SPASTRING_LB_FARMING_NORMAL_SUGARCANE_NAME 701
#define SPASTRING_LB_FARMING_NORMAL_MILK_NAME 702
#define SPASTRING_LB_FARMING_NORMAL_PUMPKINS_NAME 703
#define SPASTRING_LB_FARMING_NORMAL_RATING_NAME 704
#define SPASTRING_LB_FARMING_HARD_NAME 706
#define SPASTRING_LB_FARMING_HARD_LOCALE_NAME 707
#define SPASTRING_LB_FARMING_HARD_EGGS_NAME 708
#define SPASTRING_LB_FARMING_HARD_WHEAT_NAME 709
#define SPASTRING_LB_FARMING_HARD_MUSHROOMS_NAME 710
#define SPASTRING_LB_FARMING_HARD_SUGARCANE_NAME 711
#define SPASTRING_LB_FARMING_HARD_MILK_NAME 712
#define SPASTRING_LB_FARMING_HARD_PUMPKINS_NAME 713
#define SPASTRING_LB_FARMING_HARD_RATING_NAME 714
#define SPASTRING_LB_TRAVELLING_PEACEFUL_NAME 715
#define SPASTRING_LB_TRAVELLING_PEACEFUL_LOCALE_NAME 716
#define SPASTRING_LB_TRAVELLING_PEACEFUL_WALKED_NAME 717
#define SPASTRING_LB_TRAVELLING_PEACEFUL_SWAM_NAME 718
#define SPASTRING_LB_TRAVELLING_PEACEFUL_FALLEN_NAME 719
#define SPASTRING_LB_TRAVELLING_PEACEFUL_CLIMBED_NAME 720
#define SPASTRING_LB_TRAVELLING_PEACEFUL_MINECART_NAME 721
#define SPASTRING_LB_TRAVELLING_PEACEFUL_BOAT_NAME 722
#define SPASTRING_LB_TRAVELLING_PEACEFUL_RATING_NAME 724
#define SPASTRING_LB_TRAVELLING_EASY_NAME 726
#define SPASTRING_LB_TRAVELLING_EASY_LOCALE_NAME 727
#define SPASTRING_LB_TRAVELLING_EASY_WALKED_NAME 728
#define SPASTRING_LB_TRAVELLING_EASY_SWAM_NAME 729
#define SPASTRING_LB_TRAVELLING_EASY_FALLEN_NAME 730
#define SPASTRING_LB_TRAVELLING_EASY_CLIMBED_NAME 731
#define SPASTRING_LB_TRAVELLING_EASY_MINECART_NAME 732
#define SPASTRING_LB_TRAVELLING_EASY_BOAT_NAME 733
#define SPASTRING_LB_TRAVELLING_EASY_RATING_NAME 735
#define SPASTRING_LB_TRAVELLING_NORMAL_NAME 737
#define SPASTRING_LB_TRAVELLING_NORMAL_LOCALE_NAME 738
#define SPASTRING_LB_TRAVELLING_NORMAL_WALKED_NAME 739
#define SPASTRING_LB_TRAVELLING_NORMAL_SWAM_NAME 740
#define SPASTRING_LB_TRAVELLING_NORMAL_FALLEN_NAME 741
#define SPASTRING_LB_TRAVELLING_NORMAL_CLIMBED_NAME 742
#define SPASTRING_LB_TRAVELLING_NORMAL_MINECART_NAME 743
#define SPASTRING_LB_TRAVELLING_NORMAL_BOAT_NAME 744
#define SPASTRING_LB_TRAVELLING_NORMAL_RATING_NAME 746
#define SPASTRING_LB_TRAVELLING_HARD_NAME 748
#define SPASTRING_LB_TRAVELLING_HARD_LOCALE_NAME 749
#define SPASTRING_LB_TRAVELLING_HARD_WALKED_NAME 750
#define SPASTRING_LB_TRAVELLING_HARD_SWAM_NAME 751
#define SPASTRING_LB_TRAVELLING_HARD_FALLEN_NAME 752
#define SPASTRING_LB_TRAVELLING_HARD_CLIMBED_NAME 753
#define SPASTRING_LB_TRAVELLING_HARD_MINECART_NAME 754
#define SPASTRING_LB_TRAVELLING_HARD_BOAT_NAME 755
#define SPASTRING_LB_TRAVELLING_HARD_RATING_NAME 757
#define SPASTRING_LB_TRAVELLING_TOTAL_NAME 795
#define SPASTRING_LB_TRAVELLING_TOTAL_RATING_NAME 796
#define SPASTRING_LB_ARCADE_TRAVELLING_TOTAL_RATING_NAME 797
#define SPASTRING_PROPERTY_COLLECTED_NETHERLAVA_NAME 799
#define SPASTRING_PRESENCE_MULTIPLAYEROFFLINE_NAME 803
#define SPASTRING_PRESENCE_MULTIPLAYER_1P_NAME 804
#define SPASTRING_PRESENCE_MULTIPLAYER_1POFFLINE_NAME 805
#ifdef __cplusplus
}
#endif
#endif // __MINECRAFT_SPA_H__

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -0,0 +1,520 @@
#include "stdafx.h"
#include "XboxLeaderboardManager.h"
#include "..\Network\NetworkPlayerXbox.h"
#ifdef _XBOX
LeaderboardManager *LeaderboardManager::m_instance = new XboxLeaderboardManager(); //Singleton instance of the LeaderboardManager
#endif
const XboxLeaderboardManager::LeaderboardDescriptor XboxLeaderboardManager::LEADERBOARD_DESCRIPTORS[XboxLeaderboardManager::NUM_LEADERBOARDS][4] = {
{
XboxLeaderboardManager::LeaderboardDescriptor( STATS_VIEW_TRAVELLING_PEACEFUL, 4, STATS_COLUMN_TRAVELLING_PEACEFUL_WALKED, STATS_COLUMN_TRAVELLING_PEACEFUL_FALLEN, STATS_COLUMN_TRAVELLING_PEACEFUL_MINECART, STATS_COLUMN_TRAVELLING_PEACEFUL_BOAT, NULL, NULL, NULL,NULL),
XboxLeaderboardManager::LeaderboardDescriptor( STATS_VIEW_TRAVELLING_EASY, 4, STATS_COLUMN_TRAVELLING_EASY_WALKED, STATS_COLUMN_TRAVELLING_EASY_FALLEN, STATS_COLUMN_TRAVELLING_EASY_MINECART, STATS_COLUMN_TRAVELLING_EASY_BOAT, NULL, NULL, NULL,NULL),
XboxLeaderboardManager::LeaderboardDescriptor( STATS_VIEW_TRAVELLING_NORMAL, 4, STATS_COLUMN_TRAVELLING_NORMAL_WALKED, STATS_COLUMN_TRAVELLING_NORMAL_FALLEN, STATS_COLUMN_TRAVELLING_NORMAL_MINECART, STATS_COLUMN_TRAVELLING_NORMAL_BOAT, NULL, NULL, NULL,NULL),
XboxLeaderboardManager::LeaderboardDescriptor( STATS_VIEW_TRAVELLING_HARD, 4, STATS_COLUMN_TRAVELLING_HARD_WALKED, STATS_COLUMN_TRAVELLING_HARD_FALLEN, STATS_COLUMN_TRAVELLING_HARD_MINECART, STATS_COLUMN_TRAVELLING_HARD_BOAT, NULL, NULL, NULL,NULL),
}, {
XboxLeaderboardManager::LeaderboardDescriptor( STATS_VIEW_MINING_BLOCKS_PEACEFUL, 7, STATS_COLUMN_MINING_BLOCKS_PEACEFUL_DIRT, STATS_COLUMN_MINING_BLOCKS_PEACEFUL_STONE, STATS_COLUMN_MINING_BLOCKS_PEACEFUL_SAND, STATS_COLUMN_MINING_BLOCKS_PEACEFUL_COBBLESTONE, STATS_COLUMN_MINING_BLOCKS_PEACEFUL_GRAVEL, STATS_COLUMN_MINING_BLOCKS_PEACEFUL_CLAY, STATS_COLUMN_MINING_BLOCKS_PEACEFUL_OBSIDIAN, NULL ),
XboxLeaderboardManager::LeaderboardDescriptor( STATS_VIEW_MINING_BLOCKS_EASY, 7, STATS_COLUMN_MINING_BLOCKS_EASY_DIRT, STATS_COLUMN_MINING_BLOCKS_EASY_STONE, STATS_COLUMN_MINING_BLOCKS_EASY_SAND, STATS_COLUMN_MINING_BLOCKS_EASY_COBBLESTONE, STATS_COLUMN_MINING_BLOCKS_EASY_GRAVEL, STATS_COLUMN_MINING_BLOCKS_EASY_CLAY, STATS_COLUMN_MINING_BLOCKS_EASY_OBSIDIAN, NULL ),
XboxLeaderboardManager::LeaderboardDescriptor( STATS_VIEW_MINING_BLOCKS_NORMAL, 7, STATS_COLUMN_MINING_BLOCKS_NORMAL_DIRT, STATS_COLUMN_MINING_BLOCKS_NORMAL_STONE, STATS_COLUMN_MINING_BLOCKS_NORMAL_SAND, STATS_COLUMN_MINING_BLOCKS_NORMAL_COBBLESTONE, STATS_COLUMN_MINING_BLOCKS_NORMAL_GRAVEL, STATS_COLUMN_MINING_BLOCKS_NORMAL_CLAY, STATS_COLUMN_MINING_BLOCKS_NORMAL_OBSIDIAN, NULL ),
XboxLeaderboardManager::LeaderboardDescriptor( STATS_VIEW_MINING_BLOCKS_HARD, 7, STATS_COLUMN_MINING_BLOCKS_HARD_DIRT, STATS_COLUMN_MINING_BLOCKS_HARD_STONE, STATS_COLUMN_MINING_BLOCKS_HARD_SAND, STATS_COLUMN_MINING_BLOCKS_HARD_COBBLESTONE, STATS_COLUMN_MINING_BLOCKS_HARD_GRAVEL, STATS_COLUMN_MINING_BLOCKS_HARD_CLAY, STATS_COLUMN_MINING_BLOCKS_HARD_OBSIDIAN, NULL ),
}, {
XboxLeaderboardManager::LeaderboardDescriptor( STATS_VIEW_FARMING_PEACEFUL, 6, STATS_COLUMN_FARMING_PEACEFUL_EGGS, STATS_COLUMN_FARMING_PEACEFUL_WHEAT, STATS_COLUMN_FARMING_PEACEFUL_MUSHROOMS,STATS_COLUMN_FARMING_PEACEFUL_SUGARCANE,STATS_COLUMN_FARMING_PEACEFUL_MILK, STATS_COLUMN_FARMING_PEACEFUL_PUMPKINS, NULL, NULL ),
XboxLeaderboardManager::LeaderboardDescriptor( STATS_VIEW_FARMING_EASY, 6, STATS_COLUMN_FARMING_EASY_EGGS, STATS_COLUMN_FARMING_PEACEFUL_WHEAT, STATS_COLUMN_FARMING_EASY_MUSHROOMS, STATS_COLUMN_FARMING_EASY_SUGARCANE, STATS_COLUMN_FARMING_EASY_MILK, STATS_COLUMN_FARMING_EASY_PUMPKINS, NULL, NULL ),
XboxLeaderboardManager::LeaderboardDescriptor( STATS_VIEW_FARMING_NORMAL, 6, STATS_COLUMN_FARMING_NORMAL_EGGS, STATS_COLUMN_FARMING_NORMAL_WHEAT, STATS_COLUMN_FARMING_NORMAL_MUSHROOMS, STATS_COLUMN_FARMING_NORMAL_SUGARCANE, STATS_COLUMN_FARMING_NORMAL_MILK, STATS_COLUMN_FARMING_NORMAL_PUMPKINS, NULL, NULL ),
XboxLeaderboardManager::LeaderboardDescriptor( STATS_VIEW_FARMING_HARD, 6, STATS_COLUMN_FARMING_HARD_EGGS, STATS_COLUMN_FARMING_HARD_WHEAT, STATS_COLUMN_FARMING_HARD_MUSHROOMS, STATS_COLUMN_FARMING_HARD_SUGARCANE, STATS_COLUMN_FARMING_HARD_MILK, STATS_COLUMN_FARMING_HARD_PUMPKINS, NULL, NULL ),
}, {
XboxLeaderboardManager::LeaderboardDescriptor( NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ),
XboxLeaderboardManager::LeaderboardDescriptor( STATS_VIEW_KILLS_EASY, 7, STATS_COLUMN_KILLS_EASY_ZOMBIES, STATS_COLUMN_KILLS_EASY_SKELETONS, STATS_COLUMN_KILLS_EASY_CREEPERS, STATS_COLUMN_KILLS_EASY_SPIDERS, STATS_COLUMN_KILLS_EASY_SPIDERJOCKEYS, STATS_COLUMN_KILLS_EASY_ZOMBIEPIGMEN, STATS_COLUMN_KILLS_EASY_SLIME, NULL ),
XboxLeaderboardManager::LeaderboardDescriptor( STATS_VIEW_KILLS_NORMAL, 7, STATS_COLUMN_KILLS_NORMAL_ZOMBIES, STATS_COLUMN_KILLS_NORMAL_SKELETONS, STATS_COLUMN_KILLS_NORMAL_CREEPERS, STATS_COLUMN_KILLS_NORMAL_SPIDERS, STATS_COLUMN_KILLS_NORMAL_SPIDERJOCKEYS, STATS_COLUMN_KILLS_NORMAL_ZOMBIEPIGMEN, STATS_COLUMN_KILLS_NORMAL_SLIME, NULL ),
XboxLeaderboardManager::LeaderboardDescriptor( STATS_VIEW_KILLS_HARD, 7, STATS_COLUMN_KILLS_HARD_ZOMBIES, STATS_COLUMN_KILLS_HARD_SKELETONS, STATS_COLUMN_KILLS_HARD_CREEPERS, STATS_COLUMN_KILLS_HARD_SPIDERS, STATS_COLUMN_KILLS_HARD_SPIDERJOCKEYS, STATS_COLUMN_KILLS_HARD_ZOMBIEPIGMEN, STATS_COLUMN_KILLS_HARD_SLIME, NULL ),
},
};
XboxLeaderboardManager::XboxLeaderboardManager()
{
m_eStatsState = eStatsState_Idle;
m_statsRead = false;
m_hSession = NULL;
m_spec = NULL;
m_stats = NULL;
m_isQNetSession = false;
m_endingSession = false;
}
XboxLeaderboardManager::~XboxLeaderboardManager() {}
void XboxLeaderboardManager::Tick()
{
if( m_eStatsState == eStatsState_Getting )
{
/*if( IsStatsReadComplete() )
if( m_readCompleteCallback != NULL )
m_readCompleteCallback(m_readCompleteUserdata);*/
if ( IsStatsReadComplete() )
if (m_readListener != NULL)
{
// 4J Stu - If the state is other than ready, then we don't have any stats to sort
if(m_eFilterMode == LeaderboardManager::eFM_Friends && m_eStatsState == eStatsState_Ready) SortFriendStats();
bool ret = m_readListener->OnStatsReadComplete(m_eStatsState==eStatsState_Ready, 0, m_stats); // TODO
if (ret) m_eStatsState = eStatsState_Idle;
}
}
if( m_endingSession )
{
if( XHasOverlappedIoCompleted( &m_endSessionOverlapped ))
{
DeleteSession();
m_endingSession = false;
}
}
}
bool XboxLeaderboardManager::OpenSession()
{
//Can't create a new session when deleting a previous one
if (m_endingSession) return false;
//We've already got an open session
if (m_hSession != NULL) return true;
int lockedProfile = ProfileManager.GetLockedProfile();
if( lockedProfile == -1 )
{
m_hSession = NULL;
return false;
}
XUserGetXUID(lockedProfile, &m_myXUID);
XUserSetContext(lockedProfile, X_CONTEXT_GAME_TYPE, X_CONTEXT_GAME_TYPE_STANDARD);
//We already have a QNet session (ie we are joining/in/leaving a multiplayer game)
if(g_NetworkManager.IsInSession())
{
if(g_NetworkManager.IsInStatsEnabledSession())
{
m_isQNetSession = true;
return true;
}
//else
//{
// return false;
//}
}
XSESSION_INFO sessionInfo;
ULONGLONG sessionNonce;
DWORD ret = XSessionCreate(XSESSION_CREATE_USES_STATS | XSESSION_CREATE_HOST, lockedProfile, 8, 8, &sessionNonce, &sessionInfo, NULL, &m_hSession);
if( ret != ERROR_SUCCESS )
{
m_hSession = NULL;
return false;
}
DWORD userIndices[1] = { lockedProfile };
BOOL privateSlots[1] = { FALSE };
ret = XSessionJoinLocal(m_hSession, 1, userIndices, privateSlots, NULL);
if( ret != ERROR_SUCCESS )
{
m_hSession = NULL;
return false;
}
ret = XSessionStart(m_hSession, 0, NULL);
if( ret != ERROR_SUCCESS )
{
m_hSession = NULL;
return false;
}
return true;
}
void XboxLeaderboardManager::CloseSession()
{
if( !m_endingSession )
{
if (!XHasOverlappedIoCompleted(&m_overlapped))
XCancelOverlapped(&m_overlapped);
if (m_isQNetSession == true)
{
m_isQNetSession = false;
return;
}
if (m_hSession == NULL) return;
memset(&m_endSessionOverlapped, 0, sizeof(m_endSessionOverlapped));
DWORD ret = XSessionEnd( m_hSession, &m_endSessionOverlapped );
if (ret == ERROR_SUCCESS || ret == ERROR_IO_PENDING)
{
m_endingSession = true;
}
else
{
//Failed so just delete the session
if (ret != ERROR_SUCCESS) DeleteSession();
}
m_readListener = NULL;
}
}
void XboxLeaderboardManager::DeleteSession()
{
XSessionDelete(m_hSession, NULL);
CloseHandle(m_hSession);
m_hSession = NULL;
}
bool XboxLeaderboardManager::WriteStats(unsigned int viewCount, ViewIn views)
{
DWORD ret = S_OK;
// some debug code to catch the leaderboard write with 7 views
#ifndef _CONTENT_PACKAGE
if(viewCount>5) __debugbreak();
#endif
// 4J Stu - If we are online we already have a session, so use that
if(m_isQNetSession == true)
{
INetworkPlayer *player = g_NetworkManager.GetPlayerByXuid(m_myXUID);
if(player != NULL)
{
ret = ((NetworkPlayerXbox *)player)->GetQNetPlayer()->WriteStats(viewCount,views);
//printf("Wrote stats to QNet player\n");
}
else
{
ret = ERROR_NO_SUCH_USER;
assert(false && "Failed to write stats to a QNET session as no player exists with that XUID");
app.DebugPrintf("Failed to write stats to a QNET session as no player exists with that XUID\n");
}
}
else
{
ret = XSessionWriteStats(m_hSession, m_myXUID, viewCount, views, NULL);
}
if (ret != ERROR_SUCCESS) return false;
return true;
}
void XboxLeaderboardManager::CancelOperation()
{
//Need to have a session open
if( m_hSession == NULL )
if( !OpenSession() )
return;
//Abort any current read operation
if( m_eStatsState == eStatsState_Getting )
if( !XHasOverlappedIoCompleted( &m_overlapped ))
XCancelOverlapped( &m_overlapped );
m_eStatsState = eStatsState_Idle;
}
bool XboxLeaderboardManager::ReadStats_MyScore(LeaderboardReadListener *callback, int difficulty, EStatsType type, PlayerUID myUID, unsigned int readCount)
{
if (!readStats(difficulty,type)) return false;
if (!LeaderboardManager::ReadStats_MyScore(callback, difficulty, type, myUID, readCount)) return false;
HANDLE hEnumerator;
DWORD ret;
//DWORD readCount = 0;
m_numStats = 0;
ret = XUserCreateStatsEnumeratorByXuid(
0,
m_myXUID,
readCount,
1, //specCount,
m_spec,
&m_numStats,
&hEnumerator);
if( ret != ERROR_SUCCESS ) return false;
//Allocate a buffer for the stats
m_stats = (PXUSER_STATS_READ_RESULTS) new BYTE[m_numStats];
if (m_stats == NULL) return false;
memset(m_stats, 0, m_numStats);
memset(&m_overlapped, 0, sizeof(m_overlapped));
ret = XEnumerate(
hEnumerator, // Enumeration handle
m_stats, // Buffer
m_numStats, // Size of buffer
NULL, // Number of rows returned; not used for async
&m_overlapped ); // Overlapped structure; not used for sync
if ( (ret!=ERROR_SUCCESS) && (ret!=ERROR_IO_PENDING) ) return false;
m_eStatsState = eStatsState_Getting;
return true;
}
bool XboxLeaderboardManager::ReadStats_Friends(LeaderboardReadListener *callback, int difficulty, EStatsType type, PlayerUID myUID, unsigned int startIndex, unsigned int readCount)
{
if (!readStats(difficulty,type)) return false;
if (!LeaderboardManager::ReadStats_Friends(callback, difficulty, type, myUID, startIndex, readCount)) return false;
HANDLE hEnumerator;
DWORD ret;
unsigned int friendCount;
XUID *friends;
getFriends(friendCount, &friends);
if(friendCount == 0 || friends == NULL)
{
app.DebugPrintf("XboxLeaderboardManager::ReadStats_Friends - No friends found. Possibly you are offline?\n");
return false;
}
assert(friendCount > 0 && friends != NULL);
m_numStats = 0;
ret = XUserReadStats(
0,
friendCount,
friends,
1, //specCount,
m_spec,
&m_numStats,
NULL,
NULL
);
//Annoyingly, this returns ERROR_INSUFFICIENT_BUFFER when it is being asked to calculate the size of the buffer by passing zero resultsSize
if ( (ret!=ERROR_SUCCESS) && (ret!=ERROR_INSUFFICIENT_BUFFER) ) return false;
//Allocate a buffer for the stats
m_stats = (PXUSER_STATS_READ_RESULTS) new BYTE[m_numStats];
if (m_stats == NULL) return false;
memset(m_stats, 0, m_numStats);
memset(&m_overlapped, 0, sizeof(m_overlapped));
ret = XUserReadStats(
0,
friendCount,
friends,
1,
m_spec,
&m_numStats,
m_stats,
&m_overlapped);
if( (ret!=ERROR_SUCCESS) && (ret!=ERROR_IO_PENDING) ) return false;
m_eStatsState = eStatsState_Getting;
return true;
}
bool XboxLeaderboardManager::ReadStats_TopRank(LeaderboardReadListener *callback, int difficulty, EStatsType type , unsigned int startIndex, unsigned int readCount)
{
if (!readStats(difficulty,type)) return false;
if (!LeaderboardManager::ReadStats_TopRank(callback, difficulty, type, startIndex, readCount)) return false;
HANDLE hEnumerator;
m_numStats = 0;
DWORD ret = XUserCreateStatsEnumeratorByRank(
0, // Current title ID
startIndex, // Index to start enumerating from
readCount, // Number of rows to retrieve
1, // Number of stats specs
m_spec, // Stats spec,
&m_numStats, // Size of buffer
&hEnumerator ); // Enumeration handle
if( ret != ERROR_SUCCESS ) return false;
//Allocate a buffer for the stats
m_stats = (PXUSER_STATS_READ_RESULTS) new BYTE[m_numStats];
if (m_stats == NULL) return false;
memset(m_stats, 0, m_numStats);
memset(&m_overlapped, 0, sizeof(m_overlapped));
ret = XEnumerate(
hEnumerator, // Enumeration handle
m_stats, // Buffer
m_numStats, // Size of buffer
NULL, // Number of rows returned; not used for async
&m_overlapped ); // Overlapped structure; not used for sync
if( (ret!=ERROR_SUCCESS) && (ret!=ERROR_IO_PENDING) ) return false;
m_eStatsState = eStatsState_Getting;
return true;
}
bool XboxLeaderboardManager::readStats(int difficulty, EStatsType type)
{
//Need to have a session open
if (m_hSession==NULL) if(!OpenSession()) return false;
m_eStatsState = eStatsState_Failed;
m_statsRead = false;
if (m_stats) delete [] m_stats;
//Setup the spec structure for the read request
m_spec = new XUSER_STATS_SPEC[1];
m_spec[0].dwViewId = LEADERBOARD_DESCRIPTORS[(int)type][difficulty].m_viewId;
m_spec[0].dwNumColumnIds = LEADERBOARD_DESCRIPTORS[(int)type][difficulty].m_columnCount;
for (unsigned int i=0; i<m_spec[0].dwNumColumnIds; ++i)
m_spec[0].rgwColumnIds[i] = LEADERBOARD_DESCRIPTORS[(int)type][difficulty].m_columnIds[i];
return true;
}
void XboxLeaderboardManager::FlushStats()
{
if( m_hSession == NULL || m_isQNetSession ) return;
memset(&m_flushStatsOverlapped, 0, sizeof(m_flushStatsOverlapped));
XSessionFlushStats(m_hSession, &m_flushStatsOverlapped);
}
bool XboxLeaderboardManager::IsStatsReadComplete()
{
//If the read has completed
if( XHasOverlappedIoCompleted( &m_overlapped ) )
{
//If we've had an error
if( XGetOverlappedExtendedError( &m_overlapped ) != ERROR_SUCCESS )
{
m_eStatsState = eStatsState_Failed;
if( m_stats )
{
delete [] m_stats;
m_stats = NULL;
}
}
else
{
//If we've not got any results
if( !m_stats || m_stats->dwNumViews == 0 || m_stats->pViews[0].dwNumRows == 0 )
{
m_eStatsState = eStatsState_NoResults;
if( m_stats )
{
delete [] m_stats;
m_stats = NULL;
}
}
else
{
m_eStatsState = eStatsState_Ready;
}
}
return true;
}
return false;
}
int XboxLeaderboardManager::FriendSortFunction(const void* a, const void* b)
{
return ((int)((XUSER_STATS_ROW*)a)->dwRank) - ((int)((XUSER_STATS_ROW*)b)->dwRank);
}
void XboxLeaderboardManager::SortFriendStats()
{
for( unsigned int leaderboardIndex=0 ; leaderboardIndex<m_stats->dwNumViews ; ++leaderboardIndex )
{
//First filter out any friends who aren't in the leaderboard
XUSER_STATS_ROW* pRow = m_stats->pViews[leaderboardIndex].pRows;
//View rows is returned not including XUIDs that aren't in this leaderboard, but we want to recalculate that sort of thing
m_stats->pViews[leaderboardIndex].dwTotalViewRows = m_stats->pViews[leaderboardIndex].dwNumRows;
for( unsigned int rowIndex=0 ; rowIndex<m_stats->pViews[leaderboardIndex].dwTotalViewRows ; )
{
if( pRow->dwRank == 0 )
{
memmove( pRow, pRow + 1, ( ( m_stats->pViews[leaderboardIndex].dwTotalViewRows - rowIndex ) - 1 ) * sizeof(XUSER_STATS_ROW) );
m_stats->pViews[leaderboardIndex].dwTotalViewRows--;
}
else
{
rowIndex++;
pRow++;
}
}
//Then sort by rank
qsort( m_stats->pViews[leaderboardIndex].pRows, m_stats->pViews[leaderboardIndex].dwTotalViewRows, sizeof(XUSER_STATS_ROW), FriendSortFunction );
m_stats->pViews[leaderboardIndex].dwNumRows = m_stats->pViews[leaderboardIndex].dwTotalViewRows;
}
}
#if 0
void XboxLeaderboardManager::SetStatsRetrieved(bool success)
{
if( m_stats != NULL )
{
delete [] m_stats;
m_stats = NULL;
}
m_statsRead = success;
m_eStatsState = eStatsState_Idle;
}
#endif
// 4J-JEV: Adapted/stolen from 'XUI_Leaderboards'.
bool XboxLeaderboardManager::getFriends(unsigned int &friendsCount, PlayerUID** friends)
{
DWORD resultsSize;
HANDLE hEnumerator;
DWORD ret;
DWORD numFriends;
//First, get a list of (up to 100) friends (this is the maximum that the enumerator currently supports)
ret = XFriendsCreateEnumerator( ProfileManager.GetLockedProfile(), 0, 100, &resultsSize, &hEnumerator);
if(ret!=ERROR_SUCCESS) return false;
XONLINE_FRIEND *xonlineFriends = (XONLINE_FRIEND*) new BYTE[resultsSize];
ret = XEnumerate(
hEnumerator,
xonlineFriends,
resultsSize,
&numFriends,
NULL
);
if (ret!=ERROR_SUCCESS) friendsCount = 0;
PlayerUID *filteredFriends = new PlayerUID[numFriends+1];
friendsCount = 0;
for (unsigned int friendIndex=0; friendIndex<numFriends; ++friendIndex)
{
if( ( xonlineFriends[friendIndex].dwFriendState & (XONLINE_FRIENDSTATE_FLAG_SENTREQUEST | XONLINE_FRIENDSTATE_FLAG_RECEIVEDREQUEST) ) == 0 )
{
filteredFriends[friendsCount++] = xonlineFriends[friendIndex].xuid;
}
}
filteredFriends[friendsCount++] = m_myXUID; //m_filteredFriends[m_numFilteredFriends++] = LeaderboardManager::Instance()->GetMyXUID();
// Return.
*friends = filteredFriends;
return true;
}

View File

@@ -0,0 +1,136 @@
#pragma once
#include <xuiresource.h>
#include <xuiapp.h>
#include "..\..\Common\Leaderboards\LeaderboardManager.h"
class XboxLeaderboardManager : public LeaderboardManager
{
public:
enum EStatsState
{
eStatsState_Idle=0, //No current stats read operation
eStatsState_Getting, //Stats read in progress
eStatsState_Failed, //Stats read failed
eStatsState_Ready, //Stats read completed, ready for use
eStatsState_NoResults, //Stats read completed, no results found
eNumStatStates,
};
protected: // LEADERBOARD DESCRIPTIONS //
// From 'XUI_Leaderboards.cpp'.
// 4J Stu - Because the kills leaderboard doesn't a peaceful entry there are some special
// handling to make it skip that. We have re-arranged the order of the leaderboards so
// I am making this in case we do it again.
// 4J Stu - Made it a member of the class, rather than a #define
static const int LEADERBOARD_KILLS_POSITION = 3;
static const int NUM_LEADERBOARDS = 4;//6; //Number of leaderboards
static const int NUM_ENTRIES = 101; //Cache up to this many entries
static const int READ_SIZE = 15; //Read this many entries at a time
struct LeaderboardDescriptor {
DWORD m_viewId;
DWORD m_columnCount;
WORD m_columnIds[8];
LeaderboardDescriptor( DWORD viewId, DWORD columnCount,
WORD columnId_0, WORD columnId_1, WORD columnId_2, WORD columnId_3,
WORD columnId_4, WORD columnId_5, WORD columnId_6, WORD columnId_7)
{
m_viewId = viewId;
m_columnCount = columnCount;
m_columnIds[0] = columnId_0;
m_columnIds[1] = columnId_1;
m_columnIds[2] = columnId_2;
m_columnIds[3] = columnId_3;
m_columnIds[4] = columnId_4;
m_columnIds[5] = columnId_5;
m_columnIds[6] = columnId_6;
m_columnIds[7] = columnId_7;
}
};
static const LeaderboardDescriptor LEADERBOARD_DESCRIPTORS[NUM_LEADERBOARDS][4];
private:
EStatsState m_eStatsState; //State of the stats read
bool m_statsRead; //Whether or not the stats read operation has completed
HANDLE m_hSession; //Current session
XOVERLAPPED m_overlapped; //Overlapped structure used for async actions
XUSER_STATS_SPEC* m_spec; //Spec structure used in reads
DWORD m_numStats;
PXUSER_STATS_READ_RESULTS m_stats; //Structure that stats are read into
bool m_isQNetSession; //Session is being managed via QNet
bool m_endingSession; //Session is currently being ended
XOVERLAPPED m_endSessionOverlapped; //Overlapped stucture for end session async action
XOVERLAPPED m_flushStatsOverlapped;
public:
XboxLeaderboardManager();
~XboxLeaderboardManager();
virtual void Tick();
//Open a session
virtual bool OpenSession();
//Close a session
virtual void CloseSession();
//Delete a session
virtual void DeleteSession();
//Write the given stats
//This is called synchronously and will not free any memory allocated for views when it is done
virtual bool WriteStats(unsigned int viewCount, ViewIn views);
virtual bool ReadStats_Friends(LeaderboardReadListener *callback, int difficulty, EStatsType type, PlayerUID myUID, unsigned int startIndex, unsigned int readCount);
virtual bool ReadStats_MyScore(LeaderboardReadListener *callback, int difficulty, EStatsType type, PlayerUID myUID, unsigned int readCount);
virtual bool ReadStats_TopRank(LeaderboardReadListener *callback, int difficulty, EStatsType type , unsigned int startIndex, unsigned int readCount);
//Perform a flush of the stats
virtual void FlushStats();
//Cancel the current operation
virtual void CancelOperation();
virtual bool isIdle() { return m_eStatsState != eStatsState_Getting; }
private:
bool readStats(int difficulty, EStatsType type);
//Check if the stats read operation has completed
bool IsStatsReadComplete();
//Function used by qsort to sort friends
static int FriendSortFunction(const void* a, const void* b);
//Sort the list of friend stats
void SortFriendStats();
bool getFriends(unsigned int &friendsCount, XUID** friends);
#if 0
public:
//Should be called once the stats have been retrieved and used by the application
void SetStatsRetrieved(bool success);
EStatsState GetStatsState() { return m_eStatsState; }
bool GetStatsRead() { return m_statsRead; }
PXUSER_STATS_READ_RESULTS GetStats() { return m_stats; }
#endif
public:
PlayerUID GetMyXUID() { return m_myXUID; }
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

View File

@@ -0,0 +1,14 @@
<?xml version="1.0"?>
<xex>
<config file="C%3A%5CWork%5C4J%5CMojang%5CMinecraft%5CArt%5CXuiFiles%5Cxbox%5Cxex%2Exml"/>
<minsysver version="0x021CA700"/>
<rating bypass="1"/>
<section name="media" file="xuimedia%2Exzp"/>
<section name="584111F7" file="xbox%5CGameConfig%5CMinecraft%5FXBLA%2Espa"/>
<exportnames/>
<mediatypes>
<default/>
<livepackage/>
</mediatypes>
<gameregion system="1"/>
</xex>

View File

@@ -0,0 +1,121 @@
#include "stdafx.h"
#include "NetworkPlayerXbox.h"
NetworkPlayerXbox::NetworkPlayerXbox(IQNetPlayer *qnetPlayer)
{
m_qnetPlayer = qnetPlayer;
m_pSocket = NULL;
}
unsigned char NetworkPlayerXbox::GetSmallId()
{
return m_qnetPlayer->GetSmallId();
}
void NetworkPlayerXbox::SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority)
{
DWORD flags;
flags = QNET_SENDDATA_RELIABLE | QNET_SENDDATA_SEQUENTIAL;
if( lowPriority ) flags |= QNET_SENDDATA_LOW_PRIORITY | QNET_SENDDATA_SECONDARY;
m_qnetPlayer->SendData(((NetworkPlayerXbox *)player)->m_qnetPlayer, pvData, dataSize, flags);
}
bool NetworkPlayerXbox::IsSameSystem(INetworkPlayer *player)
{
return ( m_qnetPlayer->IsSameSystem(((NetworkPlayerXbox *)player)->m_qnetPlayer) == TRUE );
}
int NetworkPlayerXbox::GetSendQueueSizeBytes( INetworkPlayer *player, bool lowPriority )
{
DWORD flags = QNET_GETSENDQUEUESIZE_BYTES;
if( lowPriority ) flags |= QNET_GETSENDQUEUESIZE_SECONDARY_TYPE;
return m_qnetPlayer->GetSendQueueSize(player ? ((NetworkPlayerXbox *)player)->m_qnetPlayer : NULL , flags);
}
int NetworkPlayerXbox::GetSendQueueSizeMessages( INetworkPlayer *player, bool lowPriority )
{
DWORD flags = QNET_GETSENDQUEUESIZE_MESSAGES;
if( lowPriority ) flags |= QNET_GETSENDQUEUESIZE_SECONDARY_TYPE;
return m_qnetPlayer->GetSendQueueSize(player ? ((NetworkPlayerXbox *)player)->m_qnetPlayer : NULL , flags);
}
int NetworkPlayerXbox::GetCurrentRtt()
{
return m_qnetPlayer->GetCurrentRtt();
}
bool NetworkPlayerXbox::IsHost()
{
return ( m_qnetPlayer->IsHost() == TRUE );
}
bool NetworkPlayerXbox::IsGuest()
{
return ( m_qnetPlayer->IsGuest() == TRUE );
}
bool NetworkPlayerXbox::IsLocal()
{
return ( m_qnetPlayer->IsLocal() == TRUE );
}
int NetworkPlayerXbox::GetSessionIndex()
{
return m_qnetPlayer->GetSessionIndex();
}
bool NetworkPlayerXbox::IsTalking()
{
return ( m_qnetPlayer->IsTalking() == TRUE );
}
bool NetworkPlayerXbox::IsMutedByLocalUser(int userIndex)
{
return ( m_qnetPlayer->IsMutedByLocalUser(userIndex) == TRUE );
}
bool NetworkPlayerXbox::HasVoice()
{
return ( m_qnetPlayer->HasVoice() == TRUE );
}
bool NetworkPlayerXbox::HasCamera()
{
return ( m_qnetPlayer->HasCamera() == TRUE );
}
int NetworkPlayerXbox::GetUserIndex()
{
return m_qnetPlayer->GetUserIndex();
}
void NetworkPlayerXbox::SetSocket(Socket *pSocket)
{
m_pSocket = pSocket;
}
Socket *NetworkPlayerXbox::GetSocket()
{
return m_pSocket;
}
PlayerUID NetworkPlayerXbox::GetUID()
{
return m_qnetPlayer->GetXuid();
}
const wchar_t *NetworkPlayerXbox::GetOnlineName()
{
return m_qnetPlayer->GetGamertag();
}
std::wstring NetworkPlayerXbox::GetDisplayName()
{
return m_qnetPlayer->GetGamertag();
}
IQNetPlayer *NetworkPlayerXbox::GetQNetPlayer()
{
return m_qnetPlayer;
}

View File

@@ -0,0 +1,39 @@
#pragma once
#include "..\..\Common\Network\NetworkPlayerInterface.h"
// This is an implementation of the INetworkPlayer interface, for Xbox 360. It effectively wraps the IQNetPlayer class in a non-platform-specific way. It is
// managed by PlatformNetworkManagerXbox.
class NetworkPlayerXbox : public INetworkPlayer
{
public:
// Common player interface
NetworkPlayerXbox(IQNetPlayer *qnetPlayer);
virtual unsigned char GetSmallId();
virtual void SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority);
virtual bool IsSameSystem(INetworkPlayer *player);
virtual int GetSendQueueSizeBytes( INetworkPlayer *player, bool lowPriority );
virtual int GetSendQueueSizeMessages( INetworkPlayer *player, bool lowPriority );
virtual int GetCurrentRtt();
virtual bool IsHost();
virtual bool IsGuest();
virtual bool IsLocal();
virtual int GetSessionIndex();
virtual bool IsTalking();
virtual bool IsMutedByLocalUser(int userIndex);
virtual bool HasVoice();
virtual bool HasCamera();
virtual int GetUserIndex();
virtual void SetSocket(Socket *pSocket);
virtual Socket *GetSocket();
virtual const wchar_t *GetOnlineName();
virtual std::wstring GetDisplayName();
virtual PlayerUID GetUID();
// Extra xbox-specific things
IQNetPlayer *GetQNetPlayer();
private:
IQNetPlayer *m_qnetPlayer;
Socket *m_pSocket;
};

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,184 @@
#pragma once
using namespace std;
#include <vector>
#include <qnet.h>
#include "..\..\..\Minecraft.World\C4JThread.h"
#include "..\..\Common\Network\NetworkPlayerInterface.h"
#include "..\..\Common\Network\PlatformNetworkManagerInterface.h"
#include "..\..\Common\Network\SessionInfo.h"
// This is how often we allow a search for new games
#define MINECRAFT_XSESSION_SEARCH_DELAY_MILLISECONDS 30000
// This is the xbox 360 specific implementation of CPlatformNetworkManager. It is implemented using QNET. There shouldn't be any general game code in here, this class is
// for providing a bridge between the common game-side network implementation, and the lowest level platform specific libraries (QNET in this case).
class CPlatformNetworkManagerXbox : public CPlatformNetworkManager, public IQNetCallbacks
{
friend class CGameNetworkManager;
public:
virtual bool Initialise(CGameNetworkManager *pGameNetworkManager, int flagIndexSize);
virtual void Terminate();
virtual int GetJoiningReadyPercentage();
virtual int CorrectErrorIDS(int IDS);
virtual void DoWork();
virtual int GetPlayerCount();
virtual int GetOnlinePlayerCount();
virtual int GetLocalPlayerMask(int playerIndex);
virtual bool AddLocalPlayerByUserIndex( int userIndex );
virtual bool RemoveLocalPlayerByUserIndex( int userIndex );
virtual INetworkPlayer *GetLocalPlayerByUserIndex( int userIndex );
virtual INetworkPlayer *GetPlayerByIndex(int playerIndex);
virtual INetworkPlayer * GetPlayerByXuid(PlayerUID xuid);
virtual INetworkPlayer * GetPlayerBySmallId(unsigned char smallId);
virtual bool ShouldMessageForFullSession();
virtual INetworkPlayer *GetHostPlayer();
virtual bool IsHost();
virtual bool JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo);
virtual bool LeaveGame(bool bMigrateHost);
virtual bool IsInSession();
virtual bool IsInGameplay();
virtual bool IsInStatsEnabledSession();
virtual bool IsReadyToPlayOrIdle();
virtual bool SessionHasSpace(unsigned int spaceRequired = 1);
virtual void SendInviteGUI(int quadrant);
virtual bool IsAddingPlayer();
virtual void HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0);
virtual int JoinGame(FriendSessionInfo *searchResult, int localUsersMask, int primaryUserIndex );
virtual bool SetLocalGame(bool isLocal);
virtual bool IsLocalGame() { return m_bIsOfflineGame; }
virtual void SetPrivateGame(bool isPrivate);
virtual bool IsPrivateGame() { return m_bIsPrivateGame; }
virtual bool IsLeavingGame() { return m_bLeavingGame; }
virtual void ResetLeavingGame() { m_bLeavingGame = true; }
virtual void RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam);
virtual void UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam);
virtual void HandleSignInChange();
virtual bool _RunNetworkGame();
private:
bool isSystemPrimaryPlayer(IQNetPlayer *pQNetPlayer);
virtual bool _LeaveGame(bool bMigrateHost, bool bLeaveRoom);
virtual void _HostGame(int dwUsersMask, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0);
virtual bool _StartGame();
IQNet * m_pIQNet; // pointer to QNet interface
HANDLE m_notificationListener;
vector<IQNetPlayer *> m_machineQNetPrimaryPlayers; // collection of players that we deem to be the main one for that system
bool m_bLeavingGame;
bool m_bLeaveGameOnTick;
bool m_migrateHostOnLeave;
bool m_bHostChanged;
bool m_bIsOfflineGame;
bool m_bIsPrivateGame;
int m_flagIndexSize;
// This is only maintained by the host, and is not valid on client machines
GameSessionData m_hostGameSessionData;
CGameNetworkManager *m_pGameNetworkManager;
public:
virtual void UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving = NULL);
private:
// TODO 4J Stu - Do we need to be able to have more than one of these?
void (*playerChangedCallback[XUSER_MAX_COUNT])(void *callbackParam, INetworkPlayer *pPlayer, bool leaving);
void *playerChangedCallbackParam[XUSER_MAX_COUNT];
static int RemovePlayerOnSocketClosedThreadProc( void* lpParam );
virtual bool RemoveLocalPlayer( INetworkPlayer *pNetworkPlayer );
// Things for handling per-system flags
class PlayerFlags
{
public:
INetworkPlayer *m_pNetworkPlayer;
unsigned char *flags;
unsigned int count;
PlayerFlags(INetworkPlayer *pNetworkPlayer, unsigned int count);
~PlayerFlags();
};
vector<PlayerFlags *> m_playerFlags;
void SystemFlagAddPlayer(INetworkPlayer *pNetworkPlayer);
void SystemFlagRemovePlayer(INetworkPlayer *pNetworkPlayer);
void SystemFlagReset();
public:
virtual void SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index);
virtual bool SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index);
// For telemetry
private:
float m_lastPlayerEventTimeStart;
public:
wstring GatherStats();
wstring GatherRTTStats();
private:
vector<FriendSessionInfo *> friendsSessions[XUSER_MAX_COUNT];
int m_searchResultsCount[XUSER_MAX_COUNT];
int m_lastSearchStartTime[XUSER_MAX_COUNT];
// The results that will be filled in with the current search
XSESSION_SEARCHRESULT_HEADER *m_pSearchResults[XUSER_MAX_COUNT];
XNQOS *m_pQoSResult[XUSER_MAX_COUNT];
// The results from the previous search, which are currently displayed in the game
XSESSION_SEARCHRESULT_HEADER *m_pCurrentSearchResults[XUSER_MAX_COUNT];
XNQOS *m_pCurrentQoSResult[XUSER_MAX_COUNT];
int m_currentSearchResultsCount[XUSER_MAX_COUNT];
int m_lastSearchPad;
bool m_bSearchResultsReady;
bool m_bSearchPending;
LPVOID m_pSearchParam;
void (*m_SessionsUpdatedCallback)(LPVOID pParam);
C4JThread* m_SearchingThread;
void TickSearch();
void SearchForGames();
static int SearchForGamesThreadProc( void* lpParameter );
void SetSearchResultsReady(int resultCount = 0);
vector<INetworkPlayer *>currentNetworkPlayers;
INetworkPlayer *addNetworkPlayer(IQNetPlayer *pQNetPlayer);
void removeNetworkPlayer(IQNetPlayer *pQNetPlayer);
static INetworkPlayer *getNetworkPlayer(IQNetPlayer *pQNetPlayer);
virtual void SetSessionTexturePackParentId( int id );
virtual void SetSessionSubTexturePackId( int id );
virtual void Notify(int ID, ULONG_PTR Param);
public:
virtual vector<FriendSessionInfo *> *GetSessionList(int iPad, int localPlayers, bool partyOnly);
virtual bool GetGameSessionInfo(int iPad, SessionID sessionId,FriendSessionInfo *foundSession);
virtual void SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam );
virtual void GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam );
virtual void ForceFriendsSessionRefresh();
// IQNetcallback interface functions
VOID NotifyStateChanged( __in QNET_STATE OldState, __in QNET_STATE NewState, __in HRESULT hrInfo );
VOID NotifyPlayerJoined( __in IQNetPlayer *pQNetPlayer );
VOID NotifyPlayerLeaving(__in IQNetPlayer *pQNetPlayer );
VOID NotifyNewHost( __in IQNetPlayer * pQNetPlayer);
VOID NotifyDataReceived( __in IQNetPlayer * pQNetPlayerFrom, __in DWORD dwNumPlayersTo, __in_ecount(dwNumPlayersTo) IQNetPlayer ** apQNetPlayersTo, __in_bcount(dwDataSize) const BYTE * pbData, __in DWORD dwDataSize);
VOID NotifyWriteStats( __in IQNetPlayer * pQNetPlayer );
VOID NotifyReadinessChanged(__in IQNetPlayer * pQNetPlayer, __in BOOL bReady);
VOID NotifyCommSettingsChanged(__in IQNetPlayer * pQNetPlayer);
VOID NotifyGameSearchComplete(__in IQNetGameSearch * pGameSearch, __in HRESULT hrComplete, __in DWORD dwNumResults);
VOID NotifyGameInvite( __in DWORD dwUserIndex, __in const INVITE_INFO * pInviteInfo );
VOID NotifyContextChanged( __in const XUSER_CONTEXT * pContext);
VOID NotifyPropertyChanged( __in const XUSER_PROPERTY * pProperty);
};

View File

@@ -0,0 +1,4 @@
#pragma once
const int MINECRAFT_NET_MAX_PLAYERS = 8;

View File

@@ -0,0 +1,131 @@
#! /usr/bin/perl -w
use warnings;
use File::Copy::Recursive qw(fcopy rcopy dircopy fmove rmove dirmove);
open FH, '..\Xbox_BuildVer.h' or die $!;
my $lineno=1;
my $index;
while(<FH>)
{
$lineno++;
$index = rindex($_,'#define VER_PRODUCTBUILD ');
my($line) = $_;
chomp($line);
if($index>-1)
{
@build = split(/ +/, $line);
$buildnum = sprintf("%4d", $build[2]);
$buildnum=~ tr/ /0/;
}
}
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
##print 'Build num is Minecraft_', $year-100,'.',$mon+1,'.',$mday,'.',$buildnum;
$buildname=sprintf("Minecraft_%02d.%02d.%02d.%s_Release", $year-100,$mon+1,$mday,$buildnum);
$builddir=sprintf("c:/MinecraftReleaseBuilds/%s",$buildname);
print $builddir;
## now create the build directories
$dir = 'c:/MinecraftReleaseBuilds/';
unless(-d $dir)
{
mkdir $dir or die;
}
$dir = 'c:/MinecraftReleaseBuilds/pdbs/';
unless(-d $dir)
{
mkdir $dir or die;
}
$dir = 'c:/MinecraftReleaseBuilds/Zips/';
unless(-d $dir)
{
mkdir $dir or die;
}
unless(-d $builddir)
{
mkdir $builddir or die;
}
$builddir=sprintf("c:/MinecraftReleaseBuilds/%s/Docs",$buildname);
unless(-d $builddir)
{
mkdir $builddir or die;
}
$builddir=sprintf("c:/MinecraftReleaseBuilds/%s/Minecraft360",$buildname);
unless(-d $builddir)
{
mkdir $builddir or die;
}
$builddir=sprintf("c:/MinecraftReleaseBuilds/%s/Minecraft360/Saves",$buildname);
unless(-d $builddir)
{
mkdir $builddir or die;
}
## Now copy the files in
## docs
$target=sprintf("c:/MinecraftReleaseBuilds/%s/Docs/4J Minecraft XBLA Design Changes & Additions v1.0.docx",$buildname);
fcopy('../Docs/4J Minecraft XBLA Design Changes & Additions v1.0.docx',$target) or die $!;
$target=sprintf("c:/MinecraftReleaseBuilds/%s/Docs/Minecraft_XBLA_TIS_Nov2011.xls",$buildname);
fcopy('../Docs/Minecraft_XBLA_TIS_Nov2011.xls',$target) or die $!;
$target=sprintf("c:/MinecraftReleaseBuilds/%s/Docs/Minecraft_XBLA_TIS_Nov2011_Asia_SYA111511.xls",$buildname);
fcopy('../Docs/Minecraft_XBLA_TIS_Nov2011_Asia_SYA111511.xls',$target) or die $!;
$target=sprintf("c:/MinecraftReleaseBuilds/%s/Docs/Minecraft_XBLA_TIS_Nov2011_EU.xls",$buildname);
fcopy('../Docs/Minecraft_XBLA_TIS_Nov2011_EU.xls',$target) or die $!;
$target=sprintf("c:/MinecraftReleaseBuilds/%s/Docs/Xbox Live Avatar Items - Minecraft.xlsx",$buildname);
fcopy('../Docs/Xbox Live Avatar Items - Minecraft.xlsx',$target) or die $!;
## xex
$target=sprintf("c:/MinecraftReleaseBuilds/%s/Minecraft360/Minecraft_Release.xex",$buildname);
fcopy('../../Release/Minecraft.Client.xex',$target) or die $!;
## game data
$target=sprintf("c:/MinecraftReleaseBuilds/%s/Minecraft360/res/",$buildname);
rcopy('../res/',$target) or die $!;
$target=sprintf("c:/MinecraftReleaseBuilds/%s/Minecraft360/Tutorial/TutorialLevel.mcs",$buildname);
rcopy('../Tutorial/TutorialLevel.mcs',$target) or die $!;
##$target=sprintf("c:/MinecraftReleaseBuilds/%s/Minecraft360/Trial/TrialLevel.mcs",$buildname);
##rcopy('../Trial/TrialLevel.mcs',$target) or die $!;
$target=sprintf("c:/MinecraftReleaseBuilds/%s/Minecraft360/584111F70AAAAAAA",$buildname);
rcopy('../584111F70AAAAAAA',$target) or die $!;
$target=sprintf("c:/MinecraftReleaseBuilds/%s/Minecraft360/AvatarAwards",$buildname);
rcopy('../AvatarAwards',$target) or die $!;
## release files
$target=sprintf("c:/MinecraftReleaseBuilds/pdbs/%s/Release/Default.exe",$buildname);
fcopy('../../Release/Minecraft.Client.exe',$target) or die $!;
$target=sprintf("c:/MinecraftReleaseBuilds/pdbs/%s/Release/Default.pdb",$buildname);
fcopy('../../Release/Minecraft.Client.pdb',$target) or die $!;
$target=sprintf("c:/MinecraftReleaseBuilds/pdbs/%s/Release/Default.xdb",$buildname);
fcopy('../../Release/Minecraft.Client.xdb',$target) or die $!;
# Cheat save
$target=sprintf("c:/MinecraftSubmissionBuilds/%s/Test/Cheats/Content/E0000C2E8D782D00/584111F7/00000001/Save2012 11718 748.bin",$buildname);
fcopy('../Cheats/E0000C2E8D782D00/584111F7/00000001/Save2012 11718 748.bin',$target) or die $!;
$target=sprintf("c:/MinecraftSubmissionBuilds/%s/Test/Cheats/Content/E0000C2E8D782D00/FFFE07D1/00010000/E0000C2E8D782D00",$buildname);
fcopy('../Cheats/E0000C2E8D782D00/FFFE07D1/00010000/E0000C2E8D782D00',$target) or die $!;
open FH, "+>", 'zipthebuild.cmd' or die $!;
$zipline = sprintf("\"C:\\Program Files (x86)\\winzip\\wzzip\" -p -r -ex c:\\MinecraftReleaseBuilds\\Zips\\%s.zip c:\\MinecraftReleaseBuilds\\%s\\*",$buildname,$buildname);
print FH $zipline;
close FH;

Binary file not shown.

View File

@@ -0,0 +1,167 @@
#include "stdafx.h"
#include "Include\SenClientMain.h"
#include "Include\SenClientDynamicConfig.h"
#include "DynamicConfigurations.h"
MinecraftDynamicConfigurations::Dynamic_Config_Trial_Data MinecraftDynamicConfigurations::trialData;
bool MinecraftDynamicConfigurations::s_bFirstUpdateStarted = false;
bool MinecraftDynamicConfigurations::s_bUpdatedConfigs[MinecraftDynamicConfigurations::eDynamic_Config_Max];
MinecraftDynamicConfigurations::EDynamic_Configs MinecraftDynamicConfigurations::s_eCurrentConfig = MinecraftDynamicConfigurations::eDynamic_Config_Max;
size_t MinecraftDynamicConfigurations::s_currentConfigSize = 0;
size_t MinecraftDynamicConfigurations::s_dataWrittenSize = 0;
byte *MinecraftDynamicConfigurations::s_dataWritten = NULL;
void MinecraftDynamicConfigurations::Tick()
{
if(!s_bFirstUpdateStarted)
{
UpdateAllConfigurations();
s_bFirstUpdateStarted = true;
}
}
DWORD MinecraftDynamicConfigurations::GetTrialTime()
{
return trialData.trialTimeSeconds;
}
void MinecraftDynamicConfigurations::UpdateAllConfigurations()
{
for(DWORD i = 0; i < eDynamic_Config_Max; ++i)
{
s_bUpdatedConfigs[i] = false;
}
UpdateNextConfiguration();
}
void MinecraftDynamicConfigurations::UpdateNextConfiguration()
{
EDynamic_Configs update = eDynamic_Config_Max;
for(DWORD i = 0; i < eDynamic_Config_Max; ++i)
{
if(!s_bUpdatedConfigs[i])
{
update = (EDynamic_Configs)i;
break;
}
}
if( update < eDynamic_Config_Max )
{
UpdateConfiguration( update );
}
}
void MinecraftDynamicConfigurations::UpdateConfiguration(EDynamic_Configs id)
{
app.DebugPrintf("DynamicConfig: Attempting to update dynamic configuration %d\n", id);
HRESULT hr = Sentient::SenDynamicConfigGetSize( id, &s_currentConfigSize, &MinecraftDynamicConfigurations::GetSizeCompletedCallback, NULL);
switch(hr)
{
case S_OK:
s_eCurrentConfig = id;
//The server call was spawned successfully.
break;
case E_FAIL:
app.DebugPrintf("DynamicConfig: Failed to get size for config\n");
//Sentient failed to spawn the call to the server.
//An unknown error occurred. For more information, see the debug log that is available when you compile your application against the debug version of the library (SenCoreD.lib).
break;
case Sentient::SENTIENT_E_NOT_INITIALIZED:
app.DebugPrintf("DynamicConfig: Failed to get size for config as sentient not initialized\n");
//Sentient is not initialized. You must call SentientInitialize before you call this function.
break;
case E_POINTER:
app.DebugPrintf("DynamicConfig: Failed to get size for config as pointer is invalid\n");
//The out_size pointer is NULL.
break;
}
if(FAILED(hr) )
{
s_bUpdatedConfigs[s_eCurrentConfig] = true;
UpdateNextConfiguration();
}
}
void MinecraftDynamicConfigurations::GetSizeCompletedCallback(HRESULT taskResult, void *userCallbackData)
{
if( HRESULT_SUCCEEDED(taskResult) )
{
s_dataWritten = new byte[s_currentConfigSize];
HRESULT hr = Sentient::SenDynamicConfigGetBytes(
s_eCurrentConfig,
s_currentConfigSize,
&s_dataWrittenSize,
s_dataWritten,
&MinecraftDynamicConfigurations::GetDataCompletedCallback,
NULL
);
switch(hr)
{
case S_OK:
//The server call was spawned successfully.
break;
case E_FAIL:
app.DebugPrintf("DynamicConfig : Failed to get bytes for config\n");
//Sentient failed to spawn the call to the server.
//An unknown error occurred. For more information, see the debug log that is available when you compile your application against the debug version of the library (SenCoreD.lib).
break;
case Sentient::SENTIENT_E_NOT_INITIALIZED:
app.DebugPrintf("DynamicConfig : Failed to get bytes for config as sentient not initialized\n");
//Sentient is not initialized. You must call SentientInitialize before you call this function.
break;
case E_POINTER:
app.DebugPrintf("DynamicConfig: Failed to get bytes for config as pointer is NULL\n");
//The out_size pointer is NULL.
break;
}
if(FAILED(hr) )
{
s_bUpdatedConfigs[s_eCurrentConfig] = true;
UpdateNextConfiguration();
}
}
else
{
s_bUpdatedConfigs[s_eCurrentConfig] = true;
UpdateNextConfiguration();
app.DebugPrintf("MinecraftDynamicConfigurations::GetSizeCompletedCallback : FAILED\n");
}
}
void MinecraftDynamicConfigurations::GetDataCompletedCallback(HRESULT taskResult, void *userCallbackData)
{
if(HRESULT_SUCCEEDED(taskResult) && s_currentConfigSize == s_dataWrittenSize)
{
switch(s_eCurrentConfig)
{
case eDynamic_Config_Trial:
{
int version = *(int *)s_dataWritten;
switch(version)
{
case DYNAMIC_CONFIG_TRIAL_VERSION:
//case 1:
memcpy(&trialData,s_dataWritten+4,sizeof(_dynamic_config_trial_data_version1));
app.DebugPrintf("Updated dynamic config TRIAL: timer is %d\n", trialData.trialTimeSeconds);
break;
};
}
break;
};
}
else
{
app.DebugPrintf("MinecraftDynamicConfigurations::GetDataCompletedCallback : FAILED\n");
}
delete [] s_dataWritten;
s_dataWritten = NULL;
s_bUpdatedConfigs[s_eCurrentConfig] = true;
UpdateNextConfiguration();
}

View File

@@ -0,0 +1,68 @@
#pragma once
// 4J Stu - This file defines the id's for the dynamic configurations that we are currently using
// as well as the format of the data in them
/***********************
*
* TRIAL TIMER
*
************************/
#define DYNAMIC_CONFIG_TRIAL_ID 0
#define DYNAMIC_CONFIG_TRIAL_VERSION 1
#define DYNAMIC_CONFIG_DEFAULT_TRIAL_TIME 2400 //40 mins 1200 // 20 mins //300; // 5 minutes
class MinecraftDynamicConfigurations
{
private:
enum EDynamic_Configs
{
eDynamic_Config_Trial,
eDynamic_Config_Max,
};
/***********************
*
* TRIAL TIMER
*
************************/
// 4J Stu - The first 4 bytes define a version number, that defines the structure of the data
// After reading those bytes into a DWORD, the remainder of the data should be the size of the
// relevant struct and can be cast to the struct
struct _dynamic_config_trial_data_version1
{
// The time in seconds that the player can play the trial for
DWORD trialTimeSeconds;
_dynamic_config_trial_data_version1() { trialTimeSeconds = DYNAMIC_CONFIG_DEFAULT_TRIAL_TIME; }
};
typedef _dynamic_config_trial_data_version1 Dynamic_Config_Trial_Data;
// Stored configurations
static Dynamic_Config_Trial_Data trialData;
static bool s_bFirstUpdateStarted;
static bool s_bUpdatedConfigs[eDynamic_Config_Max];
static EDynamic_Configs s_eCurrentConfig;
static size_t s_currentConfigSize;
static size_t s_dataWrittenSize;
static byte *s_dataWritten;
public:
static void Tick();
static DWORD GetTrialTime();
private:
static void UpdateAllConfigurations();
static void UpdateNextConfiguration();
static void UpdateConfiguration(EDynamic_Configs id);
static void GetSizeCompletedCallback(HRESULT taskResult, void *userCallbackData);
static void GetDataCompletedCallback(HRESULT taskResult, void *userCallbackData);
};

View File

@@ -0,0 +1,419 @@
/********************************************************
* *
* Copyright (C) Microsoft. All rights reserved. *
* *
********************************************************/
// Sentient Client AvatarSuperstars Avatar API
//
// Include this to get access to all Avatar-related Sentient features.
#pragma once
#include "SenClientRawData.h"
#include "SenClientResource.h"
#include "SenClientSys.h"
#include "SenClientXML.h"
#include <xnamath.h>
#include <xonline.h>
namespace Sentient
{
//====================//
// //
// Avatar Types //
// //
//====================//
// When enumerating avatars, these are the options for pre-sorting the
// returned list.
enum SenAvatarSortBy
{
SenAvatarSortBy_Default = 0,
// ... TBD ...
};
// This structure contains the information needed to download the
// raw data for a given gender.
struct SenAvatarGenderInfo
{
SenRawDataTransferInfo metadata;
SenRawDataTransferInfo assets;
SenRawDataTransferInfo xml;
SenRawDataTransferInfo icon;
};
// This structure contains the original uploaded info plus info
// needed to download raw data.
struct SenAvatarInfo : public SenResourceInfo
{
int vipLevel;
SenAvatarGenderInfo female;
SenAvatarGenderInfo male;
};
struct SenAvatarPalette
{
XMCOLOR entry[3];
};
struct SenAvatarNamedPalette : SenAvatarPalette
{
wchar_t name[57+1];
};
/// @brief Extra avatar information.
///
/// @details This structure contains additional data about the avatar, such as localized strings and palettes.
///
struct SenAvatarExtraInfo
{
wchar_t title[XMARKETPLACE_MAX_TITLE_NAME_LENGTH+1]; ///< The localized game title associated with the avatar.
wchar_t name[XMARKETPLACE_MAX_OFFER_NAME_LENGTH+1]; ///< The localized name associated with the avatar.
wchar_t description[XMARKETPLACE_MAX_OFFER_SELL_TEXT_LENGTH+1]; ///< The localized short description associated with the avatar.
size_t paletteCount;
SenAvatarNamedPalette palette[16];
};
//========================//
// //
// Avatar Functions //
// //
//========================//
/// @brief Search the database for all the avatars that match the search criteria.
///
/// @param[in] userIndex
/// The index of the initiating user on the console. Note: This is NOT a XUID.
///
/// @param[in] avatarInfoCountMax
/// The number of SenAvatarInfo structures available in @a out_avatarInfoList.
///
/// @param[out] out_avatarInfoCount
/// This is the number of entries actually enumerated by the call.
///
/// @param[out] out_avatarInfoList
/// The structures to fill in with the enumerated information.
/// It is assumed that this is preallocated to at least @a avatarInfoCountMax entries.
///
/// @param[in] userCallback
/// If this call returns a success code, the userCallback will be called at the end of the asynchronous process.
///
/// @param[in] userCallbackData
/// Data to be passed to the @a userCallback on completion.
///
/// @return Check SUCCEEDED( hresult ) or FAILED( hresult ) to determine success. Specific values include:
/// SENTIENT_E_NOT_INITIALIZED: You did not call SentientInitialize() first.
/// SENTIENT_E_GUEST_ACCESS_VIOLATION: A guest may not spawn this call.
/// E_POINTER: out_avatarInfoList is NULL.
/// E_FAIL: Failed to spawn server call.
/// S_OK: Server call spawned successfully.
///
/// @details Enumerates in default order, at the current time, for all titles.
///
/// @related SenAvatarDownloadExtraInfo()
/// @related SenAvatarDownloadMetadata()
/// @related SenAvatarDownloadAssets()
/// @related SenAvatarDownloadIcon()
///
HRESULT SenAvatarEnumerate(
int userIndex,
size_t avatarInfoCountMax,
size_t *out_avatarInfoCount,
SenAvatarInfo *out_avatarInfoList,
SenSysCompletedCallback userCallback,
void *userCallbackData );
// Search the database for a specific avatar at the current time.
/// @brief Search the database for a specific avatar at the current time
///
/// @param[in] titleID
/// The ID of the title that the avatar item is associated with.
///
/// @param[in] resourceID
/// The ID of the specific asset about which information should be returned.
///
/// @param[out] out_avatarInfo
/// The structures to fill in with the information.
/// It is assumed that this is preallocated to at least 1 entry.
///
/// @param[in] userCallback
/// If this call returns a success code, the userCallback will be called at the end of the asynchronous process.
///
/// @param[in] userCallbackData
/// Data to be passed to the @a userCallback on completion.
///
/// @return Check SUCCEEDED( hresult ) or FAILED( hresult ) to determine success. Specific values include:
/// SENTIENT_E_NOT_INITIALIZED: You did not call SentientInitialize() first.
/// SENTIENT_E_GUEST_ACCESS_VIOLATION: A guest may not spawn this call.
/// E_POINTER: out_avatarInfo is NULL.
/// E_FAIL: Failed to spawn server call.
/// S_OK: Server call spawned successfully.
///
/// @related SenAvatarEnumerate()
/// @related SenAvatarDownloadExtraInfo()
/// @related SenAvatarDownloadMetadata()
/// @related SenAvatarDownloadAssets()
/// @related SenAvatarDownloadIcon()
///
HRESULT SenAvatarFind(
SenSysTitleID titleID,
SenResourceID resourceID,
SenAvatarInfo *out_avatarInfo,
SenSysCompletedCallback userCallback,
void *userCallbackData );
/// @brief Download the avatar metadata to the client.
///
/// @param[in] avatarInfo
/// The info describing the attributes and data of the avatar asset.
/// This is obtained from SenAvatarEnumerate().
///
/// @param[in] male
/// Whether or not to receive information about the male avatar (vs. the female)
///
/// @param[in] dataSizeMax
/// Used to indicate the size of the buffer pointed to by @a out_data.
/// If the actual size of the data exceeds this, you will receive an error.
/// It is assumed that this is at least @a avatarInfo.[fe]male.metadata.GetBufferSize() bytes.
///
/// @param[out] out_data
/// The buffer to fill in with the metadata.
///
/// @param[in] userCallback
/// If this call returns a success code, the userCallback will be called at the end of the asynchronous process.
///
/// @param[in] userCallbackData
/// Data to be passed to the @a userCallback on completion.
///
/// @return Check SUCCEEDED( hresult ) or FAILED( hresult ) to determine success. Specific values include:
/// SENTIENT_E_NOT_INITIALIZED: You did not call SentientInitialize() first.
/// E_INVALIDARG: avatarInfo.resourceID or avatarInfo.[fe]male.metadata is invalid.
/// E_POINTER: out_data is NULL.
/// E_FAIL: Failed to spawn server call.
/// S_OK: Server call spawned successfully.
///
/// @related SenAvatarEnumerate()
/// @related SenAvatarDownloadExtraInfo()
/// @related SenAvatarDownloadAssets()
/// @related SenAvatarDownloadIcon()
///
HRESULT SenAvatarDownloadMetadata(
const SenAvatarInfo &avatarInfo,
bool male,
size_t dataSizeMax,
void *out_data,
SenSysCompletedCallback userCallback,
void *userCallbackData );
/// @brief Download the avatar asset binary data to the client.
///
/// @param[in] avatarInfo
/// The info describing the attributes and data of the avatar asset.
/// This is obtained from SenAvatarEnumerate().
///
/// @param[in] male
/// Whether or not to receive information about the male avatar (vs. the female)
///
/// @param[in] dataSizeMax
/// Used to indicate the size of the buffer pointed to by @a out_data.
/// If the actual size of the data exceeds this, you will receive an error.
/// It is assumed that this is at least @a avatarInfo.[fe]male.assets.GetBufferSize() bytes.
///
/// @param[out] out_data
/// The buffer to fill in with the asset data.
///
/// @param[in] userCallback
/// If this call returns a success code, the userCallback will be called at the end of the asynchronous process.
///
/// @param[in] userCallbackData
/// Data to be passed to the @a userCallback on completion.
///
/// @return Check SUCCEEDED( hresult ) or FAILED( hresult ) to determine success. Specific values include:
/// SENTIENT_E_NOT_INITIALIZED: You did not call SentientInitialize() first.
/// E_INVALIDARG: avatarInfo.resourceID or avatarInfo.[fe]male.assets is invalid.
/// E_POINTER: out_data is NULL.
/// E_FAIL: Failed to spawn server call.
/// S_OK: Server call spawned successfully.
///
/// @related SenAvatarEnumerate()
/// @related SenAvatarDownloadExtraInfo()
/// @related SenAvatarDownloadMetadata()
/// @related SenAvatarDownloadIcon()
///
HRESULT SenAvatarDownloadAssets(
const SenAvatarInfo &avatarInfo,
bool male,
size_t dataSizeMax,
void *out_data,
SenSysCompletedCallback userCallback,
void *userCallbackData );
/// @brief Download the avatar icon binary data to the client.
///
/// @param[in] avatarInfo
/// The info describing the attributes and data of the avatar asset.
/// This is obtained from SenAvatarEnumerate().
///
/// @param[in] male
/// Whether or not to receive information about the male avatar (vs. the female)
///
/// @param[in] dataSizeMax
/// Used to indicate the size of the buffer pointed to by @a out_data.
/// If the actual size of the data exceeds this, you will receive an error.
/// It is assumed that this is at least @a avatarInfo.[fe]male.icon.GetBufferSize() bytes.
///
/// @param[out] out_data
/// The buffer to fill in with the binary icon data.
///
/// @param[in] userCallback
/// If this call returns a success code, the userCallback will be called at the end of the asynchronous process.
///
/// @param[in] userCallbackData
/// Data to be passed to the @a userCallback on completion.
///
/// @return Check SUCCEEDED( hresult ) or FAILED( hresult ) to determine success. Specific values include:
/// SENTIENT_E_NOT_INITIALIZED: You did not call SentientInitialize() first.
/// E_INVALIDARG: avatarInfo.resourceID or avatarInfo.[fe]male.icon is invalid.
/// E_POINTER: out_data is NULL.
/// E_FAIL: Failed to spawn server call.
/// S_OK: Server call spawned successfully.
///
/// @related SenAvatarEnumerate()
/// @related SenAvatarDownloadExtraInfo()
/// @related SenAvatarDownloadMetadata()
/// @related SenAvatarDownloadAssets()
///
HRESULT SenAvatarDownloadIcon(
const SenAvatarInfo &avatarInfo,
bool male,
size_t dataSizeMax,
void *out_data,
SenSysCompletedCallback userCallback,
void *userCallbackData );
/// @brief Download extra information about a given avatar to the client.
///
/// @param[in] avatarInfo
/// The info describing the attributes and data of the avatar.
/// This is obtained from SenAvatarEnumerate().
///
/// @param[in] male
/// Whether or not to receive information about the male avatar (vs. the female).
///
/// @param[out] out_avatarExtraInfo
/// The structure to populate with extra information.
///
/// @param[in] userCallback
/// If this call returns a success code, the userCallback will be called at the end of the asynchronous process.
///
/// @param[in] userCallbackData
/// Data to be passed to the @a userCallback on completion.
///
/// @return Check SUCCEEDED( hresult ) or FAILED( hresult ) to determine success. Specific values include:
/// SENTIENT_E_NOT_INITIALIZED: You did not call SentientInitialize() first.
/// E_INVALIDARG: avatarInfo.resourceID or avatarInfo.xml is invalid.
/// E_POINTER: out_avatarExtraInfo is NULL.
/// E_FAIL: Failed to spawn server call.
/// S_OK: Server call spawned successfully.
///
/// @details On completion, the structure will contain extra information, such as localized strings.
///
/// @related SenAvatarEnumerate()
/// @related SenAvatarDownloadMetadata()
/// @related SenAvatarDownloadAssets()
/// @related SenAvatarDownloadIcon()
///
HRESULT SenAvatarDownloadExtraInfo(
const SenAvatarInfo &avatarInfo,
bool male,
SenAvatarExtraInfo *out_avatarExtraInfo,
SenSysCompletedCallback userCallback, void *userCallbackData );
// Download the raw binary data to the client.
// It is assumed that out_data is preallocated to (at least) dataSizeMax bytes,
// which in turn should be at least avatarInfo.[fe]male.xml.GetBufferSize() bytes.
HRESULT SenAvatarDownloadXML(
const SenAvatarInfo &avatarInfo,
bool male,
size_t dataSizeMax,
void *out_data,
SenSysCompletedCallback userCallback,
void *userCallbackData );
// Obtain a wide, localized string with a given avatar's game title.
//
// Assumes you have already downloaded the XML and run it through
// SenXMLParse() to get a SenXML struct.
//
// First method, filling a fixed-size buffer:
//
// wchar_t buffer[1234];
// SenAvatarXMLGetTitle( xml, loc, _countof(buffer), NULL, buffer );
//
// Second method, filling a dynamically-allocated buffer:
//
// size_t bufferLength;
// SenAvatarXMLGetTitle( xml, loc, 0, &bufferLength, NULL );
// wchar_t buffer = new wchar_t[bufferLength];
// SenAvatarXMLGetTitle( xml, loc, bufferLength, NULL, buffer );
//
// Note that bufferLength is in wchars, and includes the terminating nul.
// The actual length of the _string_ is (*out_bufferLength - 1).
//
HRESULT SenAvatarXMLGetTitle(
const SenXML &senXML,
size_t bufferLengthMax,
size_t *out_bufferLength, // optional
wchar_t *out_buffer ); // optional
// Obtain a wide, localized string with a given avatar's name.
// See the similar SenAvatarGetTitle() for details.
HRESULT SenAvatarXMLGetName(
const SenXML &senXML,
size_t bufferLengthMax,
size_t *out_bufferLength, // optional
wchar_t *out_buffer ); // optional
// Obtain a wide, localized string with a given avatar's description.
// See the similar SenAvatarGetTitle() for details.
HRESULT SenAvatarXMLGetDescription(
const SenXML &senXML,
size_t bufferLengthMax,
size_t *out_bufferLength, // optional
wchar_t *out_buffer ); // optional
// Obtain the number of custom avatar palettes.
HRESULT SenAvatarXMLGetPaletteCount(
const SenXML &senXML,
size_t *out_paletteCount );
// Obtain the localized name for an avatar palettes.
// See the similar SenAvatarGetTitle() for details.
HRESULT SenAvatarXMLGetPaletteName(
const SenXML &senXML,
int paletteIndex,
size_t bufferLengthMax,
size_t *out_bufferLength, // optional
wchar_t *out_buffer ); // optional
// Obtain a single palette at a given index in the list of palettes
// for a given avatar.
HRESULT SenAvatarXMLGetPalette(
const SenXML &senXML,
int paletteIndex,
SenAvatarPalette *out_palette );
// Extract all palette entries at once.
// It is assumed that out_paletteList is preallocated to (at least)
// paletteCountMax entries.
HRESULT SenAvatarXMLGetPalettes(
const SenXML &senXML,
size_t paletteCountMax,
size_t *out_paletteCount, // optional
SenAvatarPalette *out_paletteList );
} // namespace Sentient

Some files were not shown because too many files have changed in this diff Show More