// --------------------------------------------------------- bool CPartyDef::DeclineEvent( CChar * pCharDecline, CGrayUID uidInviter ) // static { ADDTOCALLSTACK("CPartyDef::DeclineEvent"); // This should happen after a timeout as well. // " You notify %s that you do not wish to join the party" CChar * pCharInviter = uidInviter.CharFind(); if ( !pCharInviter || !pCharDecline ) return( false ); if ( uidInviter == pCharDecline->GetUID() ) return( false ); CVarDefCont * sTempVal = pCharInviter->GetTagDefs()->GetKey("PARTY_LASTINVITE"); if ( !sTempVal ) return( false ); if ((DWORD)sTempVal->GetValNum() != (DWORD)pCharDecline->GetUID()) return( false ); // Remove the key pCharInviter->DeleteKey("PARTY_LASTINVITE"); TCHAR * sTemp = Str_GetTemp(); sprintf(sTemp, g_Cfg.GetDefaultMsg(DEFMSG_PARTY_DECLINE_2), static_cast<LPCTSTR>(pCharInviter->GetName())); pCharDecline->SysMessage( sTemp ); sTemp = Str_GetTemp(); sprintf(sTemp, g_Cfg.GetDefaultMsg(DEFMSG_PARTY_DECLINE_1), static_cast<LPCTSTR>(pCharDecline->GetName())); pCharInviter->SysMessage( sTemp ); return( true ); }
bool CChar::NPC_SetVendorPrice( CItem * pItem, int iPrice ) { ADDTOCALLSTACK("CChar::NPC_SetVendorPrice"); // player vendors. // CLIMODE_PROMPT_VENDOR_PRICE // This does not check who is setting the price if if it is valid for them to do so. if ( ! NPC_IsVendor()) return( false ); if ( pItem == NULL || pItem->GetTopLevelObj() != this || pItem->GetParent() == this ) { Speak( g_Cfg.GetDefaultMsg( DEFMSG_NPC_PET_INV_ONLY ) ); return( false ); } CItemVendable * pVendItem = dynamic_cast <CItemVendable *> (pItem); if ( pVendItem == NULL ) { Speak( g_Cfg.GetDefaultMsg( DEFMSG_NPC_PET_CANTSELL ) ); return( false ); } if ( iPrice < 0 ) // just a test. return( true ); TCHAR *pszMsg = Str_GetTemp(); sprintf(pszMsg, g_Cfg.GetDefaultMsg(DEFMSG_NPC_VENDOR_SETPRICE_1), pVendItem->GetName(), iPrice); Speak(pszMsg); pVendItem->SetPlayerVendorPrice( iPrice ); return( true ); }
void CChar::NPC_OnHirePayMore( CItem * pGold, bool fHire ) { ADDTOCALLSTACK("CChar::NPC_OnHirePayMore"); // We have been handed money. // similar to PC_STATUS CCharBase * pCharDef = Char_GetDef(); unsigned int iWage = pCharDef->GetHireDayWage(); CItemContainer *pBank = GetBank(); if ( !iWage || !pBank ) return; if ( pGold ) { if ( fHire ) { pBank->m_itEqBankBox.m_Check_Amount = 0; // zero any previous balance. } pBank->m_itEqBankBox.m_Check_Amount += pGold->GetAmount(); Sound( pGold->GetDropSound( NULL )); pGold->Delete(); } TCHAR *pszMsg = Str_GetTemp(); sprintf(pszMsg, g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_HIRE_TIME), pBank->m_itEqBankBox.m_Check_Amount / iWage); Speak(pszMsg); }
lpctstr ProfileData::GetDescription(PROFILE_TYPE id) const { ADDTOCALLSTACK("ProfileData::GetDesc"); tchar * pszTmp = Str_GetTemp(); int iCount = m_PreviousTimes[id].m_iCount; if ( id >= PROFILE_DATA_QTY ) { sprintf(pszTmp, "%i (total: %i) instances", (int)(m_PreviousTimes[id].m_Time), (int)(m_AverageTimes[id].m_Time)); } else if ( id >= PROFILE_TIME_QTY ) { sprintf(pszTmp, "%i (avg: %i) bytes", (int)(m_PreviousTimes[id].m_Time), (int)(m_AverageTimes[id].m_Time)); } else { sprintf( pszTmp, "%3i.%04is avg: %3i.%04is [samples:%6i avg:%6i ] runtime: %is", (int)( m_PreviousTimes[id].m_Time / ( llTimeProfileFrequency )), (int)((( m_PreviousTimes[id].m_Time * 10000 ) / ( llTimeProfileFrequency )) % 10000 ), (int)( m_AverageTimes[id].m_Time / ( llTimeProfileFrequency )), (int)((( m_AverageTimes[id].m_Time * 10000 ) / ( llTimeProfileFrequency )) % 10000 ), iCount, (int)(m_AverageTimes[id].m_iCount), m_iAverageCount ); } return pszTmp; }
bool CChar::NPC_StablePetRetrieve( CChar * pCharPlayer ) { ADDTOCALLSTACK("CChar::NPC_StablePetRetrieve"); // Get pets for this person from my inventory. // May want to put up a menu ??? if ( !m_pNPC || m_pNPC->m_Brain != NPCBRAIN_STABLE ) return false; int iCount = 0; CItem *pItemNext = NULL; for ( CItem *pItem = GetBank()->GetContentHead(); pItem != NULL; pItem = pItemNext ) { pItemNext = pItem->GetNext(); if ( pItem->IsType(IT_FIGURINE) && pItem->m_uidLink == pCharPlayer->GetUID() ) { if ( !pCharPlayer->Use_Figurine(pItem) ) { tchar *pszTemp = Str_GetTemp(); sprintf(pszTemp, g_Cfg.GetDefaultMsg(DEFMSG_NPC_STABLEMASTER_CLAIM_FOLLOWER), pItem->GetName()); Speak(pszTemp); return true; } pItem->Delete(); iCount++; } } Speak(g_Cfg.GetDefaultMsg((iCount > 0) ? DEFMSG_NPC_STABLEMASTER_CLAIM : DEFMSG_NPC_STABLEMASTER_CLAIM_NOPETS)); return true; }
void CWebPageDef::WebPageLog() { ADDTOCALLSTACK("CWebPageDef::WebPageLog"); if ( ! m_iUpdateLog || ! m_iUpdatePeriod ) return; if ( m_type != WEBPAGE_TEMPLATE ) return; CFileText FileRead; if ( ! FileRead.Open( m_sDstFilePath, OF_READ|OF_TEXT )) return; LPCTSTR pszExt = FileRead.GetFileExt(); TCHAR szName[ _MAX_PATH ]; strcpy( szName, m_sDstFilePath ); szName[ m_sDstFilePath.GetLength() - strlen(pszExt) ] = '\0'; CGTime datetime = CGTime::GetCurrentTime(); TCHAR *pszTemp = Str_GetTemp(); sprintf(pszTemp, "%s%d%02d%02d%s", szName, datetime.GetYear()%100, datetime.GetMonth(), datetime.GetDay(), pszExt); CFileText FileTest; if ( FileTest.Open(pszTemp, OF_READ|OF_TEXT) ) return; // Copy it. WebPageUpdate(true, pszTemp, &g_Serv); }
bool CClient::addGumpDialogProps( CGrayUID uid ) { ADDTOCALLSTACK("CClient::addGumpDialogProps"); // put up a prop dialog for the object. CObjBase * pObj = uid.ObjFind(); if ( pObj == NULL ) return false; if ( m_pChar == NULL ) return( false ); if ( ! m_pChar->CanTouch( pObj )) // probably a security issue. return( false ); m_Prop_UID = m_Targ_UID = uid; if ( uid.IsChar() ) addSkillWindow(static_cast<SKILL_TYPE>(g_Cfg.m_iMaxSkill), true); TCHAR *pszMsg = Str_GetTemp(); strcpy(pszMsg, pObj->IsItem() ? "d_ITEMPROP1" : "d_CHARPROP1" ); RESOURCE_ID rid = g_Cfg.ResourceGetIDType(RES_DIALOG, pszMsg); if ( ! rid.IsValidUID()) return false; Dialog_Setup( CLIMODE_DIALOG, rid, 0, pObj ); return( true ); }
void CClient::addTargetVerb( LPCTSTR pszCmd, LPCTSTR pszArg ) { ADDTOCALLSTACK("CClient::addTargetVerb"); // Target a verb at some object . ASSERT(pszCmd); GETNONWHITESPACE(pszCmd); SKIP_SEPARATORS(pszCmd); if ( !strlen(pszCmd) ) pszCmd = pszArg; if ( pszCmd == pszArg ) { GETNONWHITESPACE(pszCmd); SKIP_SEPARATORS(pszCmd); pszArg = ""; } // priv here PLEVEL_TYPE ilevel = g_Cfg.GetPrivCommandLevel( pszCmd ); if ( ilevel > GetPrivLevel() ) return; m_Targ_Text.Format( "%s%s%s", pszCmd, ( pszArg[0] && pszCmd[0] ) ? " " : "", pszArg ); TCHAR * pszMsg = Str_GetTemp(); sprintf(pszMsg, g_Cfg.GetDefaultMsg(DEFMSG_TARGET_COMMAND), static_cast<LPCTSTR>(m_Targ_Text)); addTarget(CLIMODE_TARG_OBJ_SET, pszMsg); }
void CChar::NPC_OnHirePayMore(CItem *pGold, bool bHire) { ADDTOCALLSTACK("CChar::NPC_OnHirePayMore"); // We have been handed money. // similar to PC_STATUS CCharBase *pCharDef = Char_GetDef(); CItemContainer *pBank = GetContainerCreate(LAYER_BANKBOX); if ( !pCharDef->m_iHireDayWage || !pBank ) return; if ( pGold ) { if ( bHire ) pBank->m_itEqBankBox.m_Check_Amount = 0; // clear previous balance pBank->m_itEqBankBox.m_Check_Amount += pGold->GetAmount(); Sound(pGold->GetDropSound(NULL)); pGold->Delete(); } TCHAR *pszMsg = Str_GetTemp(); sprintf(pszMsg, g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_HIRE_TIME), pBank->m_itEqBankBox.m_Check_Amount / pCharDef->m_iHireDayWage); Speak(pszMsg); }
void CGrayStaticsBlock::LoadStatics( DWORD ulBlockIndex, int map ) { ADDTOCALLSTACK("CGrayStaticsBlock::LoadStatics"); // long ulBlockIndex = (bx*(UO_SIZE_Y/UO_BLOCK_SIZE) + by); // NOTE: What is index.m_wVal3 and index.m_wVal4 in VERFILE_STAIDX ? ASSERT( m_iStatics <= 0 ); CUOIndexRec index; if ( g_Install.ReadMulIndex(g_Install.m_Staidx[g_MapList.m_mapnum[map]], ulBlockIndex, index) ) { // make sure that the statics block length is valid if ((index.GetBlockLength() % sizeof(CUOStaticItemRec)) != 0) { TCHAR *pszTemp = Str_GetTemp(); sprintf(pszTemp, "CGrapMapBlock: Read Statics - Block Length of %lu", index.GetBlockLength()); throw CGrayError(LOGL_CRIT, CGFile::GetLastError(), pszTemp); } m_iStatics = index.GetBlockLength()/sizeof(CUOStaticItemRec); ASSERT(m_iStatics); m_pStatics = new CUOStaticItemRec[m_iStatics]; ASSERT(m_pStatics); if ( ! g_Install.ReadMulData(g_Install.m_Statics[g_MapList.m_mapnum[map]], index, m_pStatics) ) { throw CGrayError(LOGL_CRIT, CGFile::GetLastError(), "CGrayMapBlock: Read Statics"); } } }
int CChar::NPC_OnTrainCheck( CChar * pCharSrc, SKILL_TYPE Skill ) { ADDTOCALLSTACK("CChar::NPC_OnTrainCheck"); // Can we train in this skill ? // RETURN: Amount of skill we can train. // if ( !IsSkillBase(Skill) ) { Speak(g_Cfg.GetDefaultMsg(DEFMSG_NPC_TRAINER_DUNNO_1)); return 0; } int iSkillSrcVal = pCharSrc->Skill_GetBase(Skill); int iSkillVal = Skill_GetBase(Skill); int iTrainVal = NPC_GetTrainMax(pCharSrc, Skill) - iSkillSrcVal; // Train npc skill cap int iMaxDecrease = 0; if ( (pCharSrc->GetSkillTotal() + iTrainVal) > pCharSrc->Skill_GetMax(static_cast<SKILL_TYPE>(g_Cfg.m_iMaxSkill)) ) { for ( size_t i = 0; i < g_Cfg.m_iMaxSkill; i++ ) { if ( !g_Cfg.m_SkillIndexDefs.IsValidIndex(static_cast<SKILL_TYPE>(i)) ) continue; if ( pCharSrc->Skill_GetLock(static_cast<SKILL_TYPE>(i)) == SKILLLOCK_DOWN ) iMaxDecrease += pCharSrc->Skill_GetBase(static_cast<SKILL_TYPE>(i)); } iMaxDecrease = minimum(iTrainVal, iMaxDecrease); } else { iMaxDecrease = iTrainVal; } lpctstr pszMsg; if ( iSkillVal <= 0 ) { pszMsg = g_Cfg.GetDefaultMsg( DEFMSG_NPC_TRAINER_DUNNO_2 ); } else if ( iSkillSrcVal > iSkillVal ) { pszMsg = g_Cfg.GetDefaultMsg( DEFMSG_NPC_TRAINER_DUNNO_3 ); } else if ( iMaxDecrease <= 0 ) { pszMsg = g_Cfg.GetDefaultMsg( DEFMSG_NPC_TRAINER_DUNNO_4 ); } else { return( iMaxDecrease ); } char *z = Str_GetTemp(); sprintf(z, pszMsg, g_Cfg.GetSkillKey(Skill)); Speak(z); return 0; }
// Create the char corpse when i die (STATF_DEAD) or fall asleep (STATF_Sleeping) // Summoned (STATF_Conjured) and some others creatures have no corpse. CItemCorpse * CChar::MakeCorpse( bool fFrontFall ) { ADDTOCALLSTACK("CChar::MakeCorpse"); word wFlags = (word)(m_TagDefs.GetKeyNum("DEATHFLAGS", true)); if (wFlags & DEATH_NOCORPSE) return( NULL ); if (IsStatFlag(STATF_Conjured) && !(wFlags & (DEATH_NOCONJUREDEFFECT|DEATH_HASCORPSE))) { Effect(EFFECT_XYZ, ITEMID_FX_SPELL_FAIL, this, 1, 30); return( NULL ); } CItemCorpse *pCorpse = dynamic_cast<CItemCorpse *>(CItem::CreateScript(ITEMID_CORPSE, this)); if (pCorpse == NULL) // weird internal error return( NULL ); tchar *pszMsg = Str_GetTemp(); sprintf(pszMsg, g_Cfg.GetDefaultMsg(DEFMSG_MSG_CORPSE_OF), GetName()); pCorpse->SetName(pszMsg); pCorpse->SetHue(GetHue()); pCorpse->SetCorpseType(GetDispID()); pCorpse->SetAttr(ATTR_MOVE_NEVER); pCorpse->m_itCorpse.m_BaseID = m_prev_id; // id the corpse type here ! pCorpse->m_itCorpse.m_facing_dir = m_dirFace; pCorpse->m_uidLink = GetUID(); // TO-DO: Fix corpses always turning to the same dir (DIR_N) after resend it to clients if (fFrontFall) pCorpse->m_itCorpse.m_facing_dir = static_cast<DIR_TYPE>(m_dirFace|0x80); int iDecayTimer = -1; // never decay if (IsStatFlag(STATF_DEAD)) { iDecayTimer = (m_pPlayer) ? g_Cfg.m_iDecay_CorpsePlayer : g_Cfg.m_iDecay_CorpseNPC; pCorpse->SetTimeStamp(CServerTime::GetCurrentTime().GetTimeRaw()); // death time if (Attacker_GetLast()) pCorpse->m_itCorpse.m_uidKiller = Attacker_GetLast()->GetUID(); else pCorpse->m_itCorpse.m_uidKiller.InitUID(); } else // sleeping (not dead) { pCorpse->SetTimeStamp(0); pCorpse->m_itCorpse.m_uidKiller = GetUID(); } if ((m_pNPC && m_pNPC->m_bonded) || IsStatFlag(STATF_Conjured|STATF_Sleeping)) pCorpse->m_itCorpse.m_carved = 1; // corpse of bonded and summoned creatures (or sleeping players) can't be carved if ( !(wFlags & DEATH_NOLOOTDROP) ) // move non-newbie contents of the pack to corpse DropAll( pCorpse ); pCorpse->SetKeyNum("OVERRIDE.MAXWEIGHT", g_Cfg.Calc_MaxCarryWeight(this) / 10); // set corpse maxweight to prevent weird exploits like when someone place many items on an player corpse just to make this player get stuck on resurrect pCorpse->MoveToDecay(GetTopPoint(), iDecayTimer); return( pCorpse ); }
bool CChar::NPC_CheckHirelingStatus() { ADDTOCALLSTACK("CChar::NPC_CheckHirelingStatus"); // Am i happy at the moment ? // If not then free myself. // // RETURN: // true = happy. if ( ! IsStatFlag( STATF_Pet )) return( true ); CCharBase * pCharDef = Char_GetDef(); int iFoodConsumeRate = g_Cfg.m_iRegenRate[STAT_FOOD]; unsigned int iWage = pCharDef->GetHireDayWage(); if ( ! iWage || ! iFoodConsumeRate ) return( true ); // I am hired for money not for food. unsigned int iPeriodWage = IMULDIV( iWage, iFoodConsumeRate, 24 * 60 * g_Cfg.m_iGameMinuteLength ); if ( iPeriodWage <= 0 ) iPeriodWage = 1; CItemContainer * pBank = GetBank(); if ( pBank->m_itEqBankBox.m_Check_Amount > iPeriodWage ) { pBank->m_itEqBankBox.m_Check_Amount -= iPeriodWage; } else { TCHAR* pszMsg = Str_GetTemp(); sprintf(pszMsg, g_Cfg.GetDefaultMsg( DEFMSG_NPC_PET_WAGE_COST ), iWage); Speak(pszMsg); CChar * pOwner = NPC_PetGetOwner(); if ( pOwner ) { Speak( g_Cfg.GetDefaultMsg( DEFMSG_NPC_PET_HIRE_TIMEUP ) ); CItem * pMemory = Memory_AddObjTypes( pOwner, MEMORY_SPEAK ); if ( pMemory ) pMemory->m_itEqMemory.m_Action = NPC_MEM_ACT_SPEAK_HIRE; NPC_PetDesert(); return false; } // Some sort of strange bug to get here. Memory_ClearTypes( MEMORY_IPET ); StatFlag_Clear( STATF_Pet ); } return( true ); }
bool CPartyDef::RemoveMember( CGrayUID uidRemove, CGrayUID uidCommand ) { ADDTOCALLSTACK("CPartyDef::RemoveMember"); // ARGS: // uidRemove = Who is being removed. // uidCommand = who removed this person (only the master or self can remove) // // NOTE: remove of the master will cause the party to disband. if ( m_Chars.GetCharCount() <= 0 ) return false; CGrayUID uidMaster = GetMaster(); if ( (uidRemove != uidCommand) && (uidCommand != uidMaster) ) return false; CChar *pCharRemove = uidRemove.CharFind(); if ( !pCharRemove ) return false; if ( !IsInParty(pCharRemove) ) return false; if ( uidRemove == uidMaster ) return Disband(uidMaster); CChar *pSrc = uidCommand.CharFind(); if ( pSrc && IsTrigUsed(TRIGGER_PARTYREMOVE) ) { CScriptTriggerArgs args; if ( pCharRemove->OnTrigger(CTRIG_PartyRemove, pSrc, &args) == TRIGRET_RET_TRUE ) return false; } if ( IsTrigUsed(TRIGGER_PARTYLEAVE) ) { if ( pCharRemove->OnTrigger(CTRIG_PartyLeave, pCharRemove, 0) == TRIGRET_RET_TRUE ) return false; } // Remove it from the party SendRemoveList(pCharRemove, true); DetachChar(pCharRemove); pCharRemove->SysMessageDefault(DEFMSG_PARTY_LEAVE_2); TCHAR *pszMsg = Str_GetTemp(); sprintf(pszMsg, g_Cfg.GetDefaultMsg(DEFMSG_PARTY_LEAVE_1), pCharRemove->GetName()); SysMessageAll(pszMsg); if ( m_Chars.GetCharCount() <= 1 ) { // Disband the party SysMessageAll(g_Cfg.GetDefaultMsg(DEFMSG_PARTY_LEAVE_LAST_PERSON)); return Disband(uidMaster); } return true; }
size_t CGRect::Read( LPCTSTR pszVal ) { ADDTOCALLSTACK("CGRect::Read"); // parse reading the rectangle TCHAR *pszTemp = Str_GetTemp(); strcpy( pszTemp, pszVal ); TCHAR * ppVal[5]; size_t i = Str_ParseCmds( pszTemp, ppVal, COUNTOF( ppVal ), " ,\t"); switch (i) { case 5: m_map = ATOI(ppVal[4]); if (( m_map < 0 ) || ( m_map >= 256 ) || !g_MapList.m_maps[m_map] ) { g_Log.EventError("Unsupported map #%d specified. Auto-fixing that to 0.\n", m_map); m_map = 0; } m_bottom = ATOI(ppVal[3]); m_right = ATOI(ppVal[2]); m_top = ATOI(ppVal[1]); m_left = ATOI(ppVal[0]); break; case 4: m_map = 0; m_bottom = ATOI(ppVal[3]); m_right = ATOI(ppVal[2]); m_top = ATOI(ppVal[1]); m_left = ATOI(ppVal[0]); break; case 3: m_map = 0; m_bottom = 0; m_right = ATOI(ppVal[2]); m_top = ATOI(ppVal[1]); m_left = ATOI(ppVal[0]); break; case 2: m_map = 0; m_bottom = 0; m_right = 0; m_top = ATOI(ppVal[1]); m_left = ATOI(ppVal[0]); break; case 1: m_map = 0; m_bottom = 0; m_right = 0; m_top = 0; m_left = ATOI(ppVal[0]); break; } NormalizeRect(); return( i ); }
bool CItemMulti::MultiRealizeRegion() { // Add/move a region for the multi so we know when we are in it. // RETURN: ignored. DEBUG_CHECK( IsType(IT_MULTI) || IsType(IT_SHIP) ); ASSERT( IsTopLevel()); const CItemBaseMulti * pMultiDef = Multi_GetDef(); if ( pMultiDef == NULL ) { DEBUG_ERR(( "Bad Multi type 0%x, uid=0%x\n", GetID(), (DWORD) GetUID())); return false; } if ( m_pRegion == NULL ) { RESOURCE_ID rid; rid.SetPrivateUID( GetUID()); m_pRegion = new CRegionWorld( rid ); } // Get Background region. CPointMap pt = GetTopPoint(); const CRegionWorld * pRegionBack = dynamic_cast <CRegionWorld*> (pt.GetRegion( REGION_TYPE_AREA )); ASSERT( pRegionBack ); ASSERT( pRegionBack != m_pRegion ); // Create the new region rectangle. CRectMap rect; reinterpret_cast<CGRect&>(rect) = pMultiDef->m_rect; rect.OffsetRect( pt.m_x, pt.m_y ); m_pRegion->SetRegionRect( rect ); m_pRegion->m_pt = pt; DWORD dwFlags; if ( IsType(IT_SHIP)) { dwFlags = REGION_FLAG_SHIP; } else { // Houses get some of the attribs of the land around it. dwFlags = pRegionBack->GetRegionFlags(); } dwFlags |= pMultiDef->m_dwRegionFlags; m_pRegion->SetRegionFlags( dwFlags ); TCHAR *pszTemp = Str_GetTemp(); sprintf(pszTemp, "%s (%s)", (LPCTSTR) pRegionBack->GetName(), (LPCTSTR) GetName()); m_pRegion->SetName(pszTemp); return m_pRegion->RealizeRegion(); }
void CDataBase::Connect() { ADDTOCALLSTACK("CDataBase::Connect"); SimpleThreadLock lock(m_connectionMutex); if ( m_connected ) return; if ( mysql_get_client_version() < LIBMYSQL_VERSION_ID ) { #ifdef _WIN32 g_Log.EventWarn("Your MySQL client library %s is outdated. For better compatibility, update your 'libmysql.dll' file to version %s\n", mysql_get_client_info(), LIBMYSQL_VERSION); #else g_Log.EventWarn("Your MySQL client library %s is outdated. For better compatibility, update your 'libmysqlclient' package to version %s\n", mysql_get_client_info(), LIBMYSQL_VERSION); #endif } m_socket = mysql_init(NULL); if ( !m_socket ) { g_Log.EventError("Insufficient memory to initialize MySQL client socket\n"); return; } const char *user = g_Cfg.m_sMySqlUser; const char *password = g_Cfg.m_sMySqlPass; const char *db = g_Cfg.m_sMySqlDB; const char *host = g_Cfg.m_sMySqlHost; unsigned int port = MYSQL_PORT; // If user define server port using hostname:port format, split values into different variables const char *pszArgs = strchr(host, ':'); if ( pszArgs != NULL ) { char *pszTemp = Str_GetTemp(); strcpy(pszTemp, host); *(strchr(pszTemp, ':')) = 0; port = ATOI(pszArgs + 1); host = pszTemp; } if ( mysql_real_connect(m_socket, host, user, password, db, port, NULL, CLIENT_MULTI_STATEMENTS) ) { m_connected = true; if ( mysql_get_server_version(m_socket) < MYSQL_VERSION_ID ) g_Log.EventWarn("Your MySQL server %s is outdated. For better compatibility, update your MySQL server to version %s\n", mysql_get_server_info(m_socket), MYSQL_SERVER_VERSION); } else { g_Log.EventError("MySQL error #%u: %s\n", mysql_errno(m_socket), mysql_error(m_socket)); mysql_close(m_socket); m_socket = NULL; } }
void CClient::Announce(bool fArrive) const { ADDTOCALLSTACK("CClient::Announce"); if ( !m_pAccount || !m_pChar || !m_pChar->m_pPlayer ) return; // We have logged in or disconnected. // Annouce my arrival or departure. TCHAR *pszMsg = Str_GetTemp(); if ( (g_Cfg.m_iArriveDepartMsg == 2) && (GetPrivLevel() > PLEVEL_Player) ) // notify of GMs { LPCTSTR pszTitle = m_pChar->Noto_GetFameTitle(); sprintf(pszMsg, "@231 STAFF: %s%s logged %s.", pszTitle, m_pChar->GetName(), fArrive ? "in" : "out"); } else if ( g_Cfg.m_iArriveDepartMsg == 1 ) // notify of players { const CRegionBase *pRegion = m_pChar->GetTopPoint().GetRegion(REGION_TYPE_AREA); sprintf(pszMsg, g_Cfg.GetDefaultMsg(DEFMSG_MSG_ARRDEP_1), m_pChar->GetName(), g_Cfg.GetDefaultMsg(fArrive ? DEFMSG_MSG_ARRDEP_2 : DEFMSG_MSG_ARRDEP_3), pRegion ? pRegion->GetName() : g_Serv.GetName()); } if ( pszMsg ) { ClientIterator it; for ( CClient *pClient = it.next(); pClient != NULL; pClient = it.next() ) { if ( (pClient == this) || (GetPrivLevel() > pClient->GetPrivLevel()) ) continue; pClient->SysMessage(pszMsg); } } // Check murder decay timer CItem *pMurders = m_pChar->LayerFind(LAYER_FLAG_Murders); if ( pMurders ) { if ( fArrive ) { // On client login, set active timer on murder memory pMurders->SetTimeout(pMurders->m_itEqMurderCount.m_Decay_Balance * TICK_PER_SEC); } else { // Or make it inactive on logout pMurders->m_itEqMurderCount.m_Decay_Balance = static_cast<DWORD>(pMurders->GetTimerAdjusted()); pMurders->SetTimeout(-1); } } else if ( fArrive ) { // If there's no murder memory found, check if we need a new memory m_pChar->Noto_Murder(); } }
LPCTSTR CResource::Calc_MaptoSextant( CPointMap pntCoords ) { ADDTOCALLSTACK("CResource::Calc_MaptoSextant"); // Conversion from map square to degrees, minutes char *z = Str_GetTemp(); CPointMap zeroPoint; zeroPoint.Read(strcpy(z, g_Cfg.m_sZeroPoint)); long lLat = (pntCoords.m_y - zeroPoint.m_y) * 360 * 60 / g_MapList.GetY(zeroPoint.m_map); long lLong; if ( pntCoords.m_map <= 1 ) lLong = (pntCoords.m_x - zeroPoint.m_x) * 360 * 60 / UO_SIZE_X_REAL; else lLong = (pntCoords.m_x - zeroPoint.m_x) * 360 * 60 / g_MapList.GetX(pntCoords.m_map); TCHAR * pTemp = Str_GetTemp(); sprintf( pTemp, "%io %i'%s, %io %i'%s", abs(lLat / 60), abs(lLat % 60), (lLat <= 0) ? "N" : "S", abs(lLong / 60), abs(lLong % 60), (lLong >= 0) ? "E" : "W"); return pTemp; }
int CSVFile::ReadRowContent(tchar ** ppOutput, int rowIndex, int columns) { ADDTOCALLSTACK("CSVFile::ReadRowContent"); ASSERT(columns > 0 && columns <= MAX_COLUMNS); if ( (int)GetPosition() != rowIndex ) Seek(rowIndex, SEEK_SET); tchar * pszLine = Str_GetTemp(); if ( ReadString(pszLine, THREAD_STRING_LENGTH) == NULL ) return 0; return Str_ParseCmds(pszLine, ppOutput, columns, "\t"); }
void CItemMessage::r_Write( CScript & s ) { CItemVendable::r_Write( s ); s.WriteKey( "AUTHOR", m_sAuthor ); TCHAR *pszTemp = Str_GetTemp(); // Store the message body lines. MAX_BOOK_PAGES for ( int i=0; i<GetPageCount(); i++ ) { sprintf(pszTemp, "BODY.%d", i); LPCTSTR pszText = GetPageText(i); s.WriteKey(pszTemp, ( pszText ) ? pszText : "" ); } }
const TCHAR * CValueCurveDef::Write() const { ADDTOCALLSTACK("CValueCurveDef::Write"); TCHAR * pszOut = Str_GetTemp(); size_t j = 0; size_t iQty = m_aiValues.GetCount(); for ( size_t i = 0; i < iQty; i++ ) { if ( i > 0 ) pszOut[j++] = ','; j += sprintf( pszOut + j, "%d", m_aiValues[i] ); } pszOut[j] = '\0'; return pszOut; }
// --------------------------------------------------------- bool CPartyDef::MessageEvent( CGrayUID uidDst, CGrayUID uidSrc, const NCHAR * pText, int ilenmsg ) { ADDTOCALLSTACK("CPartyDef::MessageEvent"); UNREFERENCED_PARAMETER(ilenmsg); if ( pText == NULL ) return( false ); if ( uidDst && !IsInParty( uidDst.CharFind() ) ) return( false ); CChar * pFrom = uidSrc.CharFind(); CChar * pTo = NULL; if ( uidDst != (DWORD) 0 ) pTo = uidDst.CharFind(); TCHAR * szText = Str_GetTemp(); CvtNUNICODEToSystem( szText, MAX_TALK_BUFFER, pText, MAX_TALK_BUFFER ); if ( ! m_pSpeechFunction.IsEmpty() ) { TRIGRET_TYPE tr = TRIGRET_RET_FALSE; CScriptTriggerArgs Args; Args.m_iN1 = uidSrc; Args.m_iN2 = uidDst; Args.m_s1 = szText; Args.m_s1_raw = szText; if ( r_Call(m_pSpeechFunction, &g_Serv, &Args, NULL, &tr) ) { if ( tr == TRIGRET_RET_TRUE ) return( false ); } } if ( g_Log.IsLoggedMask( LOGM_PLAYER_SPEAK )) g_Log.Event( LOGM_PLAYER_SPEAK, "%lx:'%s' Says '%s' in party to '%s'\n", pFrom->GetClient()->GetSocketID(), pFrom->GetName(), szText, pTo ? pTo->GetName() : "all" ); sprintf(szText, g_Cfg.GetDefaultMsg( DEFMSG_PARTY_MSG ), pText); PacketPartyChat cmd(pFrom, pText); if ( pTo != NULL ) SendMemberMsg(pTo, &cmd); else SendAll(&cmd); return( true ); }
bool CChar::NPC_OnHireHear( CChar * pCharSrc ) { ADDTOCALLSTACK("CChar::NPC_OnHireHear"); if ( !m_pNPC ) return false; CCharBase * pCharDef = Char_GetDef(); unsigned int iWage = pCharDef->GetHireDayWage(); if ( ! iWage ) { Speak( g_Cfg.GetDefaultMsg( DEFMSG_NPC_PET_NOT_FOR_HIRE ) ); return false; } CItemMemory * pMemory = Memory_FindObj( pCharSrc ); if ( pMemory ) { if ( pMemory->IsMemoryTypes(MEMORY_IPET|MEMORY_FRIEND)) { // Next gold i get goes toward hire. pMemory->m_itEqMemory.m_Action = NPC_MEM_ACT_SPEAK_HIRE; NPC_OnHirePayMore( NULL, false ); return true; } if ( pMemory->IsMemoryTypes( MEMORY_FIGHT|MEMORY_HARMEDBY|MEMORY_IRRITATEDBY )) { Speak( g_Cfg.GetDefaultMsg( DEFMSG_NPC_PET_NOT_WORK ) ); return false; } } if ( IsStatFlag( STATF_Pet )) { Speak( g_Cfg.GetDefaultMsg( DEFMSG_NPC_PET_EMPLOYED ) ); return false; } TCHAR *pszMsg = Str_GetTemp(); sprintf(pszMsg, Calc_GetRandVal(2) ? g_Cfg.GetDefaultMsg( DEFMSG_NPC_PET_HIRE_AMNT ) : g_Cfg.GetDefaultMsg( DEFMSG_NPC_PET_HIRE_RATE ), iWage ); Speak(pszMsg); pMemory = Memory_AddObjTypes( pCharSrc, MEMORY_SPEAK ); if ( pMemory ) pMemory->m_itEqMemory.m_Action = NPC_MEM_ACT_SPEAK_HIRE; return true; }
LPCTSTR CGrayMapBlockState::GetTileName( DWORD dwID ) // static { ADDTOCALLSTACK("CGrayMapBlockState::GetTileName"); if ( dwID == 0 ) { return( "<null>" ); } TCHAR * pStr = Str_GetTemp(); if ( dwID < TERRAIN_QTY ) { CGrayTerrainInfo land( static_cast<WORD>(dwID) ); strcpy( pStr, land.m_name ); } else { dwID -= TERRAIN_QTY; CGrayItemInfo item(static_cast<ITEMID_TYPE>(dwID)); strcpy( pStr, item.m_name ); } return( pStr ); }
LPCTSTR CResourceBase::ResourceGetName( RESOURCE_ID_BASE rid ) const { ADDTOCALLSTACK("CResourceBase::ResourceGetName"); // Get a portable name for the resource id type. CResourceDef * pResourceDef = dynamic_cast <CResourceDef *>( ResourceGetDef( rid )); if ( pResourceDef ) return( pResourceDef->GetResourceName()); TCHAR * pszTmp = Str_GetTemp(); ASSERT(pszTmp); if ( ! rid.IsValidUID()) { sprintf( pszTmp, "%ld", static_cast<long>(rid.GetPrivateUID()) ); } else { sprintf( pszTmp, "0%x", rid.GetResIndex() ); } return( pszTmp ); }
LPCTSTR CGTime::FormatGmt(LPCTSTR pszFormat) const { TCHAR * pszTemp = Str_GetTemp(); if ( pszFormat == NULL ) { pszFormat = "%a, %d %b %Y %H:%M:%S GMT"; } struct tm* ptmTemp = gmtime(&m_time); if (ptmTemp == NULL ) { pszTemp[0] = '\0'; return( pszTemp ); } if (!strftime( pszTemp, maxTimeBufferSize, pszFormat, ptmTemp)) { pszTemp[0] = '\0'; } return pszTemp; }
bool CLog::OpenLog( LPCTSTR pszBaseDirName ) // name set previously. { if ( m_fLockOpen ) // the log is already locked open return( false ); if ( m_sBaseDir == NULL ) return false; if ( pszBaseDirName != NULL ) { if ( pszBaseDirName[0] && pszBaseDirName[1] == '\0' ) { if ( *pszBaseDirName == '0' ) { Close(); return false; } } else { m_sBaseDir = pszBaseDirName; } } // Get the new name based on date. m_dateStamp = CGTime::GetCurrentTime(); TCHAR *pszTemp = Str_GetTemp(); sprintf(pszTemp, GRAY_FILE "%d-%02d-%02d.log", m_dateStamp.GetYear(), m_dateStamp.GetMonth(), m_dateStamp.GetDay()); CGString sFileName = GetMergedFileName(m_sBaseDir, pszTemp); // Use the OF_READWRITE to append to an existing file. if ( CFileText::Open( sFileName, OF_SHARE_DENY_NONE|OF_READWRITE|OF_TEXT ) ) { setvbuf(m_pStream, NULL, _IONBF, 0); return true; } return false; }
void CItemStone::AnnounceWar( const CItemStone * pEnemyStone, bool fWeDeclare, bool fWar ) { ADDTOCALLSTACK("CItemStone::AnnounceWar"); // Announce we are at war or peace. ASSERT(pEnemyStone); bool fAtWar = IsAtWarWith(pEnemyStone); TCHAR *pszTemp = Str_GetTemp(); int len = sprintf( pszTemp, (fWar) ? "%s %s declared war on %s." : "%s %s requested peace with %s.", (fWeDeclare) ? "You" : pEnemyStone->GetName(), (fWeDeclare) ? "have" : "has", (fWeDeclare) ? pEnemyStone->GetName() : "You" ); if ( fAtWar ) { sprintf( pszTemp+len, " War is ON!" ); } else if ( fWar ) { sprintf( pszTemp+len, " War is NOT yet on." ); } else { sprintf( pszTemp+len, " War is OFF." ); } CStoneMember * pMember = STATIC_CAST <CStoneMember *>(GetHead()); for ( ; pMember != NULL; pMember = pMember->GetNext()) { CChar * pChar = pMember->GetLinkUID().CharFind(); if ( pChar == NULL ) continue; if ( ! pChar->IsClient()) continue; pChar->SysMessage( pszTemp ); } }
void CChat::WhereIs(CChatChanMember * pBy, LPCTSTR pszName ) const { ADDTOCALLSTACK("CChat::WhereIs"); ClientIterator it; for (CClient* pClient = it.next(); pClient != NULL; pClient = it.next()) { if ( ! strcmp( pClient->GetChatName(), pszName)) continue; TCHAR *pszMsg = Str_GetTemp(); if (! pClient->IsChatActive() || !pClient->GetChannel()) sprintf(pszMsg, "%s is not currently in a conference.", pszName); else sprintf(pszMsg, "%s is in conference '%s'.", static_cast<LPCTSTR>(pszName), static_cast<LPCTSTR>(pClient->GetChannel()->GetName())); CGString sFrom; DecorateName(sFrom, NULL, true); pBy->SendChatMsg(CHATMSG_PlayerTalk, sFrom, pszMsg); return; } pBy->SendChatMsg(CHATMSG_NoPlayer, pszName); }