// ObjectFile.cpp: implementation of the CObjectFile class. // ////////////////////////////////////////////////////////////////////// #include "p4objects.h" LINK_ENTITY_TO_CLASS( object_file, CObjectFile) #define MAX_REVS 150 void CObjectFile::Spawn() { Precache( ); SET_MODEL( ENT(pev), "models/file/w_file.mdl" ); UTIL_SetOrigin( pev, pev->origin ); target = (Vector)pev->origin; //by default, we're already where we want to be. UTIL_SetSize( pev, Vector(-5, -15, 38), Vector( 5, 15, 86) ); //collision box! level = 0; pev->movetype = MOVETYPE_FLY; // pev->sequence = LookupActivity (ACT_IDLE); // pev->frame = 0; // pev->framerate = 1; pev->solid = SOLID_BBOX; SetThink( Think ); SetTouch( Touch ); pev->nextthink = gpGlobals->time + 0.5; } void CObjectFile::Precache() { PRECACHE_MODEL("models/file/w_file.mdl"); } void CObjectFile :: Think( void ) { if (!IsInWorld()) { parent->disown( this ); UTIL_Remove( this ); return; } if (UTIL_VecUpdate( &(pev->origin), target )) { pev->nextthink = gpGlobals->time + 0.05; UTIL_SetSize( pev, Vector(-5, -15, 38), Vector( 5, 15, 86) ); //collision box! } else pev->nextthink = gpGlobals->time + 0.5; } void CObjectFile :: Touch( CBaseEntity* Thing ) { CBasePlayer *pl; CBaseEntity *be = CBaseEntity::Instance(Thing->pev->owner); if (Thing->IsPlayer()) pl = (CBasePlayer*) Thing; else if (be->IsPlayer()) pl = (CBasePlayer*) be; else return; if (pl->m_flNextP4Time > gpGlobals->time) return; pl->m_flNextP4Time = gpGlobals->time + 0.5; if (Thing->IsExpand()) { Expand( pl ); return; } if (Thing->IsLong()) { Long( pl ); return; } pl->m_flNextP4Time = gpGlobals->time + 0.2; UTIL_PrintHud(pl, path.Text()); } void CObjectFile::Long( CBasePlayer* pl ) { ClientFileUser ui; ui.logflag = TRUE; ClientApi client; Error e; StrBuf msg = StrBuf(); client.Init( &e ); if (e.GetSeverity()) { e.Fmt(&msg); UTIL_FatalHud(pl, msg.Text()); pl->m_flNextP4Time = gpGlobals->time + 20.0; //20 second delay on connect error return; } char* args[1]; args[0] = path.Text(); client.SetArgv(1, args); client.Run( "filelog", &ui ); client.Final( &e ); if (e.GetSeverity()) { e.Fmt(&msg); UTIL_WarningHud(pl, msg.Text()); } UTIL_PrintHud( pl, ui.filelog.Text()); } void CObjectFile::Expand( CBasePlayer* pl ) { if (level == 1) return; StrBuf hudmsg = StrBuf(); hudmsg.Append("Displaying history of "); hudmsg.Append(path.Text()); hudmsg.Append("..."); UTIL_PrintHud( pl, hudmsg.Text()); //killKids(this); newLevel(1); parent->killKids(this); FileLogCache* cache = new FileLogCache(path); /* create an entity for each one - don't set up "from" pointers yet*/ if (cache->main == NULL) return; FileHead* hwork = cache->main; FileRev* rwork = hwork->head; CObjectRev* orev; int xcoord; int ycoord; short revsmade = 1; while (rwork != NULL) { if (revsmade > MAXRESULTS) break; orev = GetClassPtr( (CObjectRev *) NULL); revsmade++; orev->type = rwork->type; revs.Append(orev); rwork->ent = orev; orev->revobj = rwork; xcoord = cache->changes->GetPos(rwork->change); orev->pev->classname = MAKE_STRING("object_rev"); orev->Spawn(); orev->pev->origin = pev->origin + Vector(-xcoord, 0, 0); orev->target = target - Vector(0,0,100); orev->target.x -= xcoord*15; orev->filerev = hwork->file; orev->filerev.Append("#"); orev->filerev.Append(&(rwork->rev)); orev->parent = this; orev->pev->nextthink = gpGlobals->time; rwork = rwork->next; } hwork = cache->from; ycoord = 0; while (hwork != NULL) { ycoord++; rwork = hwork->head; while (rwork != NULL) { if (revsmade > MAXRESULTS) break; orev = GetClassPtr( (CObjectRev *) NULL); revsmade++; orev->type = rwork->type; revs.Append(orev); rwork->ent = orev; orev->revobj = rwork; xcoord = cache->changes->GetPos(rwork->change); orev->pev->classname = MAKE_STRING("object_rev"); orev->Spawn(); orev->pev->origin = pev->origin + Vector(-xcoord, ycoord, 0); orev->target = target - Vector(0,0,100); orev->target.x -= xcoord*15; orev->target.y += ycoord*20; orev->filerev = hwork->file; orev->filerev.Append("#"); orev->filerev.Append(&(rwork->rev)); orev->parent = this; orev->pev->nextthink = gpGlobals->time; rwork = rwork->next; } hwork = hwork->next; } hwork = cache->into; ycoord = 0; while (hwork != NULL) { ycoord++; rwork = hwork->head; while (rwork != NULL) { if (revsmade > MAXRESULTS) break; orev = GetClassPtr( (CObjectRev *) NULL); revsmade++; orev->type = rwork->type; revs.Append(orev); rwork->ent = orev; orev->revobj = rwork; xcoord = cache->changes->GetPos(rwork->change); orev->pev->classname = MAKE_STRING("object_rev"); orev->Spawn(); orev->pev->origin = pev->origin + Vector(-xcoord, -ycoord, 0); orev->target = target - Vector(0,0,95); orev->target.x -= xcoord*15; orev->target.y -= ycoord*20; orev->filerev = hwork->file; orev->filerev.Append("#"); orev->filerev.Append(&(rwork->rev)); orev->parent = this; orev->pev->nextthink = gpGlobals->time; rwork = rwork->next; } hwork = hwork->next; } /* now that they've all been spawned we can run around setting up pointers */ ListNode* scan = revs.head; CObjectRev* obj; while (scan != NULL) { obj = (CObjectRev*) scan->ent; if (obj == NULL) break; if (obj->revobj->next != NULL) obj->next = obj->revobj->next->ent; if (obj->revobj->from != NULL) { obj->from = obj->revobj->from->ent; switch (obj->revobj->fromtype) { default: case TYPE_MERGE: obj->red = 0; obj->green = 0; obj->blue = 255; obj->bright = 255; break; case TYPE_BRANCH: obj->red = 255; obj->green = 255; obj->blue = 0; obj->bright = 255; break; case TYPE_DIRTY: obj->red = 255; obj->green = 0; obj->blue = 0; obj->bright = 255; break; case TYPE_COPY: obj->red = 0; obj->green = 255; obj->blue = 0; obj->bright = 255; break; case TYPE_IGNORE: obj->red = 255; obj->green = 0; obj->blue = 255; obj->bright = 182; break; } } scan = scan->next; } delete cache; if (revsmade > MAXRESULTS) UTIL_WarningHud(pl, "Output truncated!\n"); } void CObjectFile :: newLevel( short newlev ) { if (newlev > 0) { Vector parvec = parent->targvec(); target.x = parvec.x; target.y = parvec.y; } target.z += (newlev - level)*100; level = newlev; parent->newLevel(level+1); } void CObjectFile :: disown ( CBaseEntity *Target ) //this does the OPPOSITE of killKids!!! { revs.EKill(Target); } void CObjectFile :: killKids( CBaseEntity *Caller ) { bool callerFlag = false; CBaseEntity* kid = revs.EPop(); while (kid != NULL) { if (kid == Caller) { callerFlag = TRUE; kid = revs.EPop(); continue; } kid -> killKids(this); UTIL_Remove(kid); kid = revs.EPop(); } if (callerFlag) revs.Append(Caller); } CObjectFile::CObjectFile() { } /* CObjectFile::~CObjectFile() { } */
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#2 | 937 | Sam Stafford |
Renaming my guest directory to the more conventional sam_stafford. |
||
#1 | 936 | Sam Stafford |
Adding P4HL to the public depot. See relnotes.txt for installation instructions; all relevant files are under p4hl/dist. Source code is under p4hl/src in the form of a VC++ project. |