Removed limit on strcat builtin's length.

Fixed issues with DP7 protocol.
Fixed .fatness.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@3965 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2012-01-28 10:30:44 +00:00
parent aa72d14cec
commit 4496bb6ea0
28 changed files with 555 additions and 213 deletions

View File

@ -1149,6 +1149,7 @@ help:
@-echo "SDL - Attempt to use sdl for the current target" @-echo "SDL - Attempt to use sdl for the current target"
@-echo "win32 - Mingw compile for win32" @-echo "win32 - Mingw compile for win32"
@-echo "vc - Attempts to use msvc8+ to compile. Note: uses profile guided optimisations. You must build+run the relevent profile target before a release target will compile properly. Debug doesn't care." @-echo "vc - Attempts to use msvc8+ to compile. Note: uses profile guided optimisations. You must build+run the relevent profile target before a release target will compile properly. Debug doesn't care."
@-echo "android is different - use 'make droid-help' for explicit help."
install: install:
-cp debug/*.* /opt/quake/ -cp debug/*.* /opt/quake/
@ -1201,11 +1202,25 @@ droid-rel: droid/build.xml droid/ftekeystore
mkdir -p droid/libs/armeabi mkdir -p droid/libs/armeabi
@cp $(RELEASE_DIR)/libftedroid.so droid/libs/armeabi/ @cp $(RELEASE_DIR)/libftedroid.so droid/libs/armeabi/
@cd droid && $(ANT) release @cd droid && $(ANT) release
ifneq ($(DROID_PACKSC),)
@echo
@echo
@echo Adding custom data files (non-compressed)
@echo
zip droid/bin/FTEDroid-release-unsigned.apk -0 -j $(DROID_PACKSU)
endif
ifneq ($(DROID_PACKSU),)
@echo
@echo
@echo Adding custom data files (compressed)
@echo
zip droid/bin/FTEDroid-release-unsigned.apk -9 -j $(DROID_PACKSC)
endif
@echo @echo
@echo @echo
@echo Signing package... I hope you remember your password. @echo Signing package... I hope you remember your password.
@echo @echo
$(JAVATOOL)jarsigner -digestalg SHA1 -sigalg MD5withRSA -keystore droid/ftekeystore droid/bin/FTEDroid-release-unsigned.apk autogen $(JAVATOOL)jarsigner $(JARSIGNARGS) -digestalg SHA1 -sigalg MD5withRSA -keystore droid/ftekeystore droid/bin/FTEDroid-release-unsigned.apk autogen
-rm -f $(RELEASE_DIR)/FTEDroid.apk -rm -f $(RELEASE_DIR)/FTEDroid.apk
$(DROID_SDK_PATH)/tools/zipalign 4 droid/bin/FTEDroid-release-unsigned.apk $(RELEASE_DIR)/FTEDroid.apk $(DROID_SDK_PATH)/tools/zipalign 4 droid/bin/FTEDroid-release-unsigned.apk $(RELEASE_DIR)/FTEDroid.apk
@ -1224,3 +1239,19 @@ droid-dbg: droid/build.xml
@cd droid && $(ANT) debug && $(ANT) debug install @cd droid && $(ANT) debug && $(ANT) debug install
cp droid/bin/FTEDroid-debug.apk $(DEBUG_DIR)/FTEDroid.apk cp droid/bin/FTEDroid-debug.apk $(DEBUG_DIR)/FTEDroid.apk
droid-help:
@-echo "make droid-dbg - compiles engine with debug info and signs package with debug key. Attempts to install onto emulator."
@-echo "make droid-opt - compiles engine with optimisations, but does not sign package. Not useful."
@-echo "make droid-rel - compiles engine with optimisations, adds custom data files, signs with private key, requires password."
@-echo
@-echo "Android Settings:
@-echo "DROID_PACKSC: specifies additional pak or pk3 files to compress into the package, which avoids extra configuration. Only used in release builds. You probably shouldn't use this except for really small packages. Any file seeks will give really poor performance."
@-echo "DROID_PACKSU: like DROID_PACKSC, but without compression. Faster loading times, but bigger. Use for anything that is already compressed (especially pk3s)."
@-echo "DROID_SDK_PATH: path to the android sdk install path."
@-echo "DROID_NDK_PATH: path to the android ndk install path."
@-echo "ANT: path and name of apache ant. Probably doesn't need to be set if you're on linux."
@-echo "JAVA_HOME: path of your java install. Commonly already set in environment settings."
@-echo "JAVATOOL: path to your java install's bin directory. Doesn't need to be set if its already in your path."
@-echo "JARSIGNARGS: Additional optional arguments to java's jarsigner program. You may want to put -storepass FOO in here, but what ever you do - keep it secure. Avoid bash history snooping, etc. If its not present, you will safely be prompted as required."
@-echo
@-echo "Note that 'make droid-rel' will automatically generate a keystore. If you forget the password, just do a 'make dist-clean'."

View File

@ -745,6 +745,9 @@ void DP5_ParseDelta(entity_state_t *s)
s->trans = 255; s->trans = 255;
s->scale = 16; s->scale = 16;
s->number = num; s->number = num;
s->colormod[0] = 32;
s->colormod[1] = 32;
s->colormod[2] = 32;
// s->active = true; // s->active = true;
} }
if (bits & E5_FLAGS) if (bits & E5_FLAGS)
@ -852,32 +855,30 @@ void CLNQ_ParseDarkPlaces5Entities(void) //the things I do.. :o(
//well, they come in in order of priorities, but that's not useful to us. //well, they come in in order of priorities, but that's not useful to us.
//I guess this means we'll have to go slowly. //I guess this means we'll have to go slowly.
packet_entities_t *pack, *oldpack; //dp deltas update in-place
//this gets in the way of tracking multiple frames, and thus doesn't match fte too well
packet_entities_t *pack, oldpack;
static packet_entities_t newpack;
entity_state_t *to, *from; entity_state_t *to, *from;
unsigned short read; unsigned short read;
int oldi; int oldi, newi, lowesti, lowestv, newremaining;
qboolean remove; qboolean remove;
cl_latestframenum = MSG_ReadLong(); cl_latestframenum = MSG_ReadLong(); /*server sequence to be acked*/
if (cls.protocol_nq >= CPNQ_DP7) if (cls.protocol_nq >= CPNQ_DP7)
cl.ackedinputsequence = MSG_ReadLong(); cl.ackedinputsequence = MSG_ReadLong(); /*client input sequence which has been acked*/
cl.frames[(cls.netchan.incoming_sequence)&UPDATE_MASK].receivedtime = realtime;
pack = &cl.frames[(cls.netchan.incoming_sequence)&UPDATE_MASK].packet_entities; pack = &cl.frames[(cls.netchan.incoming_sequence)&UPDATE_MASK].packet_entities;
pack->servertime = cl.gametime; pack->servertime = cl.gametime;
oldpack = &cl.frames[(cls.netchan.incoming_sequence-1)&UPDATE_MASK].packet_entities; oldpack = *pack;
from = oldpack->entities;
oldi = 0; oldi = 0;
pack->num_entities = 0;
for (oldi = 0; oldi < oldpack->num_entities; oldi++)
{
from = &oldpack->entities[oldi];
from->flags &= ~0x80000000;
}
newpack.num_entities = 0;
for (read = MSG_ReadShort(); read!=0x8000; read = MSG_ReadShort()) for (read = MSG_ReadShort(); read!=0x8000; read = MSG_ReadShort())
{ {
if (msg_badread) if (msg_badread)
@ -890,11 +891,11 @@ void CLNQ_ParseDarkPlaces5Entities(void) //the things I do.. :o(
from = &defaultstate; from = &defaultstate;
for (oldi=0 ; oldi<oldpack->num_entities ; oldi++) for (oldi=0 ; oldi<oldpack.num_entities ; oldi++)
{ {
if (read == oldpack->entities[oldi].number) if (read == oldpack.entities[oldi].number)
{ {
from = &oldpack->entities[oldi]; from = &oldpack.entities[oldi];
from->flags |= 0x80000000; //so we don't copy it. from->flags |= 0x80000000; //so we don't copy it.
break; break;
} }
@ -905,40 +906,82 @@ void CLNQ_ParseDarkPlaces5Entities(void) //the things I do.. :o(
continue; continue;
} }
if (pack->num_entities==pack->max_entities) if (newpack.num_entities==newpack.max_entities)
{ {
pack->max_entities = pack->num_entities+16; newpack.max_entities = newpack.num_entities+16;
pack->entities = BZ_Realloc(pack->entities, sizeof(entity_state_t)*pack->max_entities); newpack.entities = BZ_Realloc(newpack.entities, sizeof(entity_state_t)*newpack.max_entities);
} }
to = &pack->entities[pack->num_entities]; to = &newpack.entities[newpack.num_entities];
pack->num_entities++; newpack.num_entities++;
memcpy(to, from, sizeof(*to)); memcpy(to, from, sizeof(*to));
to->number = read; to->number = read;
DP5_ParseDelta(to); DP5_ParseDelta(to);
to->flags &= ~0x80000000; to->flags &= ~0x80000000;
} }
//the pack has all the new ones in it, now copy the old ones in that wern't removed (or changed). /*we're writing into the old one, clear it out prematurely (to make the malloc below trigger, and free it at the end)*/
for (oldi = 0; oldi < oldpack->num_entities; oldi++) pack->max_entities = 0;
{ pack->entities = NULL;
from = &oldpack->entities[oldi];
if (from->flags & 0x80000000)
continue;
if (pack->num_entities==pack->max_entities) //make sure there's enough space for both lists
if (oldpack.num_entities + newpack.num_entities>=pack->max_entities)
{
pack->max_entities = oldpack.num_entities + newpack.num_entities;
pack->entities = BZ_Realloc(pack->entities, sizeof(entity_state_t)*pack->max_entities);
}
pack->num_entities = 0;
//we're read all the new states, so have current info
//merge the packets, sorting the new ones (so the output is always sorted)
for (oldi = 0, lowesti=0, lowestv = 0, newremaining = newpack.num_entities; newremaining || oldi < oldpack.num_entities; )
{
if (oldi == oldpack.num_entities)
from = NULL;
else
{ {
pack->max_entities = pack->num_entities+16; from = &oldpack.entities[oldi];
pack->entities = BZ_Realloc(pack->entities, sizeof(entity_state_t)*pack->max_entities); if (from->flags & 0x80000000)
{
oldi++;
continue;
}
} }
if (newremaining && !lowestv)
{
lowestv = 0x7ffffffe;
for(newi = 0; newi < newpack.num_entities; newi++)
{
if (newpack.entities[newi].flags & 0x80000000)
continue;
if (newpack.entities[newi].number < lowestv)
{
lowestv = newpack.entities[newi].number;
lowesti = newi;
}
}
}
/*use the new packet instead if we need to*/
if (!from || (from->number > lowestv && lowestv))
{
from = &newpack.entities[lowesti];
from->flags |= 0x80000000;
lowestv = 0; /*find the next oldest*/
newremaining--;
}
else
oldi++;
to = &pack->entities[pack->num_entities]; to = &pack->entities[pack->num_entities];
pack->num_entities++; pack->num_entities++;
from = &oldpack->entities[oldi];
memcpy(to, from, sizeof(*to)); memcpy(to, from, sizeof(*to));
to->flags &= ~0x80000000;
} }
BZ_Free(oldpack.entities);
} }
void CLNQ_ParseEntity(unsigned int bits) void CLNQ_ParseEntity(unsigned int bits)
@ -1902,6 +1945,7 @@ void CL_TransitionEntities (void)
/*transition the ents and stuff*/ /*transition the ents and stuff*/
packnew = &cl.frames[newf].packet_entities; packnew = &cl.frames[newf].packet_entities;
packold = &cl.frames[oldf].packet_entities; packold = &cl.frames[oldf].packet_entities;
CL_TransitionPacketEntities(packnew, packold, servertime); CL_TransitionPacketEntities(packnew, packold, servertime);
cl.currentpacktime = servertime; cl.currentpacktime = servertime;
cl.currentpackentities = packnew; cl.currentpackentities = packnew;
@ -2694,16 +2738,16 @@ void CL_ParsePlayerinfo (void)
state->fatness = 0; state->fatness = 0;
#ifdef PEXT_SCALE #ifdef PEXT_SCALE
if (flags & PF_SCALE_Z && cls.fteprotocolextensions & PEXT_SCALE) if (flags & PF_SCALE && cls.fteprotocolextensions & PEXT_SCALE)
state->scale = (float)MSG_ReadByte()/50; state->scale = (float)MSG_ReadByte()/50;
#endif #endif
#ifdef PEXT_TRANS #ifdef PEXT_TRANS
if (flags & PF_TRANS_Z && cls.fteprotocolextensions & PEXT_TRANS) if (flags & PF_TRANS && cls.fteprotocolextensions & PEXT_TRANS)
state->alpha = MSG_ReadByte(); state->alpha = MSG_ReadByte();
#endif #endif
#ifdef PEXT_FATNESS #ifdef PEXT_FATNESS
if (flags & PF_FATNESS_Z && cls.fteprotocolextensions & PEXT_FATNESS) if (flags & PF_FATNESS && cls.fteprotocolextensions & PEXT_FATNESS)
state->fatness = (float)MSG_ReadChar() / 16; state->fatness = (float)MSG_ReadChar();
#endif #endif
#ifdef PEXT_HULLSIZE #ifdef PEXT_HULLSIZE
if (cls.fteprotocolextensions & PEXT_HULLSIZE) if (cls.fteprotocolextensions & PEXT_HULLSIZE)
@ -3077,7 +3121,7 @@ void CL_LinkPlayers (void)
if (state->alpha != 255) if (state->alpha != 255)
ent->flags |= Q2RF_TRANSLUCENT; ent->flags |= Q2RF_TRANSLUCENT;
ent->fatness = state->fatness/16; ent->fatness = state->fatness;
// //
// angles // angles
// //

View File

@ -1567,7 +1567,7 @@ void CL_SendCmd (double frametime, qboolean mainloop)
cmd = &cl.frames[i].cmd[0]; cmd = &cl.frames[i].cmd[0];
*cmd = independantphysics[0]; *cmd = independantphysics[0];
cl.frames[i].senttime = realtime; cl.frames[i].senttime = realtime;
cl.frames[i].receivedtime = 0; // nq doesn't allow us to find our own packetloss cl.frames[i].receivedtime = -1; // nq doesn't allow us to find our own packetloss
#ifdef CSQC_DAT #ifdef CSQC_DAT
CSQC_Input_Frame(0, cmd); CSQC_Input_Frame(0, cmd);

View File

@ -3705,6 +3705,10 @@ void CL_ParseClientdata (void)
cl.parsecount = i; cl.parsecount = i;
i &= UPDATE_MASK; i &= UPDATE_MASK;
parsecountmod = i; parsecountmod = i;
if (CPNQ_IS_DP)
i = cls.netchan.incoming_sequence & UPDATE_MASK;
frame = &cl.frames[i]; frame = &cl.frames[i];
if (cls.demoplayback == DPB_MVD || cls.demoplayback == DPB_EZTV) if (cls.demoplayback == DPB_MVD || cls.demoplayback == DPB_EZTV)
frame->senttime = realtime - host_frametime; frame->senttime = realtime - host_frametime;
@ -6021,7 +6025,19 @@ void CLNQ_ParseServerMessage (void)
cl.gametime = MSG_ReadFloat(); cl.gametime = MSG_ReadFloat();
cl.gametimemark = realtime; cl.gametimemark = realtime;
if (!CPNQ_IS_DP) if (CPNQ_IS_DP)
{
int n = cls.netchan.incoming_sequence&UPDATE_MASK, o = (cls.netchan.incoming_sequence-1)&UPDATE_MASK;
cl.frames[n].packet_entities.num_entities = cl.frames[o].packet_entities.num_entities;
if (cl.frames[n].packet_entities.max_entities < cl.frames[o].packet_entities.num_entities)
{
cl.frames[n].packet_entities.max_entities = cl.frames[o].packet_entities.max_entities;
cl.frames[n].packet_entities.entities = BZ_Realloc(cl.frames[n].packet_entities.entities, sizeof(entity_state_t) * cl.frames[n].packet_entities.max_entities);
}
memcpy(cl.frames[n].packet_entities.entities, cl.frames[o].packet_entities.entities, sizeof(entity_state_t) * cl.frames[o].packet_entities.num_entities);
cl.frames[n].packet_entities.servertime = cl.frames[o].packet_entities.servertime;
}
else
{ {
// cl.frames[(cls.netchan.incoming_sequence-1)&UPDATE_MASK].packet_entities = cl.frames[cls.netchan.incoming_sequence&UPDATE_MASK].packet_entities; // cl.frames[(cls.netchan.incoming_sequence-1)&UPDATE_MASK].packet_entities = cl.frames[cls.netchan.incoming_sequence&UPDATE_MASK].packet_entities;
cl.frames[cls.netchan.incoming_sequence&UPDATE_MASK].packet_entities.num_entities=0; cl.frames[cls.netchan.incoming_sequence&UPDATE_MASK].packet_entities.num_entities=0;

View File

@ -1340,7 +1340,7 @@ void MasterInfo_Request(master_t *mast, qboolean evenifwedonthavethefiles)
case MT_MASTERDP: case MT_MASTERDP:
{ {
char *str; char *str;
str = va("%c%c%c%cgetservers %s %u empty full\x0A\n", 255, 255, 255, 255, com_protocolname.string, 3); str = va("%c%c%c%cgetservers %s %u empty full"/*\x0A\n"*/, 255, 255, 255, 255, com_protocolname.string, 3);
NET_SendPollPacket (strlen(str), str, mast->adr); NET_SendPollPacket (strlen(str), str, mast->adr);
} }
break; break;
@ -1491,7 +1491,7 @@ void MasterInfo_Refresh(void)
// if (q1servers) //qw master servers // if (q1servers) //qw master servers
{ {
Master_AddMasterHTTP("http://www.gameaholic.com/servers/qspy-quakeworld", MT_MASTERHTTPQW, "gameaholic's QW master"); // Master_AddMasterHTTP("http://www.gameaholic.com/servers/qspy-quakeworld", MT_MASTERHTTPQW, "gameaholic's QW master");
//Master_AddMaster("satan.idsoftware.com:27000", MT_MASTERQW, "id Limbo"); //Master_AddMaster("satan.idsoftware.com:27000", MT_MASTERQW, "id Limbo");
//Master_AddMaster("satan.idsoftware.com:27002", MT_MASTERQW, "id CTF"); //Master_AddMaster("satan.idsoftware.com:27002", MT_MASTERQW, "id CTF");
//Master_AddMaster("satan.idsoftware.com:27003", MT_MASTERQW, "id TeamFortress"); //Master_AddMaster("satan.idsoftware.com:27003", MT_MASTERQW, "id TeamFortress");
@ -1507,26 +1507,26 @@ void MasterInfo_Refresh(void)
//Master_AddMaster("kubus.rulez.pl:27000",MT_MASTERQW, "Kubus"); //Master_AddMaster("kubus.rulez.pl:27000",MT_MASTERQW, "Kubus");
//Master_AddMaster("telefrag.me:27000",MT_MASTERQW, "Telefrag.ME"); //Master_AddMaster("telefrag.me:27000",MT_MASTERQW, "Telefrag.ME");
//Master_AddMaster("master.teamdamage.com:27000", MT_MASTERQW, "TeamDamage"); //Master_AddMaster("master.teamdamage.com:27000", MT_MASTERQW, "TeamDamage");
Master_AddMaster("master.quakeservers.net:27000", MT_MASTERQW, "QuakeServers.net"); // Master_AddMaster("master.quakeservers.net:27000", MT_MASTERQW, "QuakeServers.net");
Master_AddMaster("qwmaster.fodquake.net:27000", MT_MASTERQW, "Fodquake.net"); // Master_AddMaster("qwmaster.fodquake.net:27000", MT_MASTERQW, "Fodquake.net");
Master_AddMaster("masterserver.exhale.de:27000", MT_MASTERQW, "team exhale"); // Master_AddMaster("masterserver.exhale.de:27000", MT_MASTERQW, "team exhale");
Master_AddMaster("asgaard.morphos-team.net:27000", MT_MASTERQW, "Asgaard master server."); // Master_AddMaster("asgaard.morphos-team.net:27000", MT_MASTERQW, "Asgaard master server.");
Master_AddMaster("qwmaster.ocrana.de:27000", MT_MASTERQW, "Ocrana2 master server."); // Master_AddMaster("qwmaster.ocrana.de:27000", MT_MASTERQW, "Ocrana2 master server.");
Master_AddMaster("255.255.255.255:27500", MT_BCASTQW, "Nearby QuakeWorld UDP servers."); // Master_AddMaster("255.255.255.255:27500", MT_BCASTQW, "Nearby QuakeWorld UDP servers.");
} }
// if (q1servers) //nq master servers // if (q1servers) //nq master servers
{ {
//Master_AddMaster("12.166.196.192:27950", MT_MASTERDP, "DarkPlaces Master 3"); //Master_AddMaster("12.166.196.192:27950", MT_MASTERDP, "DarkPlaces Master 3");
Master_AddMasterHTTP("http://www.gameaholic.com/servers/qspy-quake", MT_MASTERHTTPNQ, "gameaholic's NQ master"); // Master_AddMasterHTTP("http://www.gameaholic.com/servers/qspy-quake", MT_MASTERHTTPNQ, "gameaholic's NQ master");
Master_AddMasterHTTP("http://servers.quakeone.com/index.php?format=json", MT_MASTERHTTPJSON, "quakeone's server listing"); // Master_AddMasterHTTP("http://servers.quakeone.com/index.php?format=json", MT_MASTERHTTPJSON, "quakeone's server listing");
Master_AddMaster("ghdigital.com:27950", MT_MASTERDP, "DarkPlaces Master 1"); // LordHavoc Master_AddMaster("69.59.212.88:27950"/*"ghdigital.com:27950"*/, MT_MASTERDP, "DarkPlaces Master 1"); // LordHavoc
Master_AddMaster("dpmaster.deathmask.net:27950", MT_MASTERDP, "DarkPlaces Master 2"); // Willis Master_AddMaster("64.22.107.125:27950"/*"dpmaster.deathmask.net:27950"*/, MT_MASTERDP, "DarkPlaces Master 2"); // Willis
Master_AddMaster("dpmaster.tchr.no:27950", MT_MASTERDP, "DarkPlaces Master 3"); // tChr Master_AddMaster("92.62.40.73:27950"/*"dpmaster.tchr.no:27950"*/, MT_MASTERDP, "DarkPlaces Master 3"); // tChr
#ifdef IPPROTO_IPV6 #ifdef IPPROTO_IPV6
//Master_AddMaster("[2001:41d0:2:1628::4450]:27950", MT_MASTERDP, "DarkPlaces Master 4"); // dpmaster.div0.qc.to (admin: divVerent) //Master_AddMaster("[2001:41d0:2:1628::4450]:27950", MT_MASTERDP, "DarkPlaces Master 4"); // dpmaster.div0.qc.to (admin: divVerent)
#endif #endif
Master_AddMaster("255.255.255.255:26000", MT_BCASTNQ, "Nearby Quake1 servers"); // Master_AddMaster("255.255.255.255:26000", MT_BCASTNQ, "Nearby Quake1 servers");
Master_AddMaster("255.255.255.255:26000", MT_BCASTDP, "Nearby DarkPlaces servers"); Master_AddMaster("255.255.255.255:26000", MT_BCASTDP, "Nearby DarkPlaces servers");
} }
@ -1536,19 +1536,19 @@ void MasterInfo_Refresh(void)
//Master_AddMaster("satan.idsoftware.com:27900", MT_MASTERQ2, "id q2 Master."); //Master_AddMaster("satan.idsoftware.com:27900", MT_MASTERQ2, "id q2 Master.");
//Master_AddMaster("master.planetgloom.com:27900",MT_MASTERQ2, "Planetgloom.com"); //Master_AddMaster("master.planetgloom.com:27900",MT_MASTERQ2, "Planetgloom.com");
//Master_AddMaster("master.q2servers.com:27900", MT_MASTERQ2, "q2servers.com"); //Master_AddMaster("master.q2servers.com:27900", MT_MASTERQ2, "q2servers.com");
Master_AddMaster("netdome.biz:27900", MT_MASTERQ2, "Netdome.biz"); // Master_AddMaster("netdome.biz:27900", MT_MASTERQ2, "Netdome.biz");
Master_AddMaster("masterserver.exhale.de:27900",MT_MASTERQ2, "team exhale"); // Master_AddMaster("masterserver.exhale.de:27900",MT_MASTERQ2, "team exhale");
Master_AddMaster("255.255.255.255:27910", MT_BCASTQ2, "Nearby Quake2 UDP servers."); // Master_AddMaster("255.255.255.255:27910", MT_BCASTQ2, "Nearby Quake2 UDP servers.");
#ifdef USEIPX #ifdef USEIPX
Master_AddMaster("00000000:ffffffffffff:27910", MT_BCASTQ2, "Nearby Quake2 IPX servers."); // Master_AddMaster("00000000:ffffffffffff:27910", MT_BCASTQ2, "Nearby Quake2 IPX servers.");
#endif #endif
} }
//q3 //q3
{ {
//Master_AddMasterHTTP("http://www.gameaholic.com/servers/qspy-quake3", MT_MASTERHTTPQW, "gameaholic's Q3 master"); //Master_AddMasterHTTP("http://www.gameaholic.com/servers/qspy-quake3", MT_MASTERHTTPQW, "gameaholic's Q3 master");
Master_AddMaster("master.quake3arena.com:27950", MT_MASTERQ3, "Quake3 master server."); // Master_AddMaster("master.quake3arena.com:27950", MT_MASTERQ3, "Quake3 master server.");
Master_AddMaster("masterserver.exhale.de:27950", MT_MASTERQ3, "team exhale"); // Master_AddMaster("masterserver.exhale.de:27950", MT_MASTERQ3, "team exhale");
//Master_AddMaster("master3.quake3arena.com:27950", MT_MASTERQ3, "Quake3 master3 server."); //Master_AddMaster("master3.quake3arena.com:27950", MT_MASTERQ3, "Quake3 master3 server.");
Master_AddMaster("255.255.255.255:27960", MT_BCASTQ3, "Nearby Quake3 UDP servers."); Master_AddMaster("255.255.255.255:27960", MT_BCASTQ3, "Nearby Quake3 UDP servers.");
} }

View File

@ -39,16 +39,25 @@ JNIEXPORT void JNICALL Java_com_fteqw_FTEDroidEngine_frame(JNIEnv *env, jobject
} }
JNIEXPORT void JNICALL Java_com_fteqw_FTEDroidEngine_init(JNIEnv *env, jobject obj, JNIEXPORT void JNICALL Java_com_fteqw_FTEDroidEngine_init(JNIEnv *env, jobject obj,
jint width, jint height) jint width, jint height, jstring path)
{ {
vid.pixelwidth = width; vid.pixelwidth = width;
vid.pixelheight = height; vid.pixelheight = height;
if (!sys_running) if (!sys_running)
{ {
char *args [] =
{
"ftedroid",
"-basepack",
(*env)->GetStringUTFChars(env, path, 0),
"",
""
//we should do this somewhere... (*env)->ReleaseStringUTFChars(env, path, parms.basedir);
};
quakeparms_t parms; quakeparms_t parms;
parms.basedir = "/sdcard/fte"; parms.basedir = "/sdcard/fte";
parms.argc = 0; parms.argc = 3;
parms.argv = NULL; parms.argv = args;
parms.memsize = sys_memheap = 8*1024*1024; parms.memsize = sys_memheap = 8*1024*1024;
parms.membase = malloc(parms.memsize); parms.membase = malloc(parms.memsize);
if (!parms.membase) if (!parms.membase)
@ -57,7 +66,7 @@ JNIEXPORT void JNICALL Java_com_fteqw_FTEDroidEngine_init(JNIEnv *env, jobject o
return; return;
} }
Sys_Printf("Starting up\n"); Sys_Printf("Starting up (%s)\n", args[2]);
COM_InitArgv(parms.argc, parms.argv); COM_InitArgv(parms.argc, parms.argv);
TL_InitLanguages(); TL_InitLanguages();
@ -364,7 +373,8 @@ int Sys_EnumerateFiles (const char *gpath, const char *match, int (*func)(const
return true; return true;
} }
/* #if 0
#include <android/asset_manager.h>
int Sys_EnumerateFiles (const char *gpath, const char *match, int (*func)(const char *, int, void *), void *parm) int Sys_EnumerateFiles (const char *gpath, const char *match, int (*func)(const char *, int, void *), void *parm)
{ {
qboolean go = true; qboolean go = true;
@ -385,6 +395,7 @@ Sys_Printf("Found %s\n", f);
AAssetDir_close(ad); AAssetDir_close(ad);
return 0; return 0;
} }
typedef struct typedef struct
{ {
vfsfile_t funcs; vfsfile_t funcs;
@ -445,4 +456,4 @@ vfsfile_t *Sys_OpenAsset(char *fname)
return (vfsfile_t*)file; return (vfsfile_t*)file;
} }
*/ #endif

View File

@ -1298,7 +1298,19 @@ static void R_LerpFrames(mesh_t *mesh, galiaspose_t *p1, galiaspose_t *p2, float
mesh->normals_array = p1n; mesh->normals_array = p1n;
mesh->snormals_array = p1s; mesh->snormals_array = p1s;
mesh->tnormals_array = p1t; mesh->tnormals_array = p1t;
mesh->xyz_array = p1v;
if (expand)
{
for (i = 0; i < mesh->numvertexes; i++)
{
mesh->xyz_array[i][0] = p1v[i][0] + p1n[i][0]*expand;
mesh->xyz_array[i][1] = p1v[i][1] + p1n[i][1]*expand;
mesh->xyz_array[i][2] = p1v[i][2] + p1n[i][2]*expand;
}
return;
}
else
mesh->xyz_array = p1v;
} }
else else
{ {
@ -1312,20 +1324,8 @@ static void R_LerpFrames(mesh_t *mesh, galiaspose_t *p1, galiaspose_t *p2, float
mesh->xyz_array[i][1] = p1v[i][1]*lerp + p2v[i][1]*blerp; mesh->xyz_array[i][1] = p1v[i][1]*lerp + p2v[i][1]*blerp;
mesh->xyz_array[i][2] = p1v[i][2]*lerp + p2v[i][2]*blerp; mesh->xyz_array[i][2] = p1v[i][2]*lerp + p2v[i][2]*blerp;
} }
}
if (expand)
{
if (mesh->xyz_array == p1v)
{
for (i = 0; i < mesh->numvertexes; i++)
{
mesh->xyz_array[i][0] = p1v[i][0] + mesh->normals_array[i][0]*expand;
mesh->xyz_array[i][1] = p1v[i][1] + mesh->normals_array[i][1]*expand;
mesh->xyz_array[i][2] = p1v[i][2] + mesh->normals_array[i][2]*expand;
}
} if (expand)
else
{ {
for (i = 0; i < mesh->numvertexes; i++) for (i = 0; i < mesh->numvertexes; i++)
{ {

View File

@ -1681,11 +1681,14 @@ char *COM_FileExtension (const char *in)
{ {
static char exten[8]; static char exten[8];
int i; int i;
char *dot;
while (*in && *in != '.') for (dot = in + strlen(in); dot >= in && *dot != '.'; dot--)
in++; ;
if (!*in) if (dot < in)
return ""; return "";
in = dot;
in++; in++;
for (i=0 ; i<7 && *in ; i++,in++) for (i=0 ; i<7 && *in ; i++,in++)
exten[i] = *in; exten[i] = *in;
@ -1714,6 +1717,7 @@ void COM_CleanUpPath(char *str)
} }
while ((dots = strstr(str, ".."))) while ((dots = strstr(str, "..")))
{ {
critisize = 0;
for (slash = dots-2; slash >= str; slash--) for (slash = dots-2; slash >= str; slash--)
{ {
if (*slash == '/') if (*slash == '/')
@ -1723,6 +1727,11 @@ void COM_CleanUpPath(char *str)
break; break;
} }
} }
if (critisize != 3)
{
memmove(dots, dots+2, strlen(dots+2)+1);
critisize = 3;
}
} }
while(*str == '/') while(*str == '/')
{ {

View File

@ -25,9 +25,10 @@ struct
{ {
const char *extension; const char *extension;
searchpathfuncs_t *funcs; searchpathfuncs_t *funcs;
qboolean loadscan;
} searchpathformats[64]; } searchpathformats[64];
int FS_RegisterFileSystemType(const char *extension, searchpathfuncs_t *funcs) int FS_RegisterFileSystemType(const char *extension, searchpathfuncs_t *funcs, qboolean loadscan)
{ {
unsigned int i; unsigned int i;
for (i = 0; i < sizeof(searchpathformats)/sizeof(searchpathformats[0]); i++) for (i = 0; i < sizeof(searchpathformats)/sizeof(searchpathformats[0]); i++)
@ -42,6 +43,7 @@ int FS_RegisterFileSystemType(const char *extension, searchpathfuncs_t *funcs)
searchpathformats[i].extension = extension; searchpathformats[i].extension = extension;
searchpathformats[i].funcs = funcs; searchpathformats[i].funcs = funcs;
searchpathformats[i].loadscan = loadscan;
com_fschanged = true; com_fschanged = true;
return i+1; return i+1;
@ -1441,7 +1443,7 @@ static searchpath_t *FS_AddPathHandle(const char *purepath, const char *probable
{ {
for (i = 0; i < sizeof(searchpathformats)/sizeof(searchpathformats[0]); i++) for (i = 0; i < sizeof(searchpathformats)/sizeof(searchpathformats[0]); i++)
{ {
if (!searchpathformats[i].extension || !searchpathformats[i].funcs || !searchpathformats[i].funcs->OpenNew) if (!searchpathformats[i].extension || !searchpathformats[i].funcs || !searchpathformats[i].funcs->OpenNew || !searchpathformats[i].loadscan)
continue; continue;
if (loadstuff & (1<<i)) if (loadstuff & (1<<i))
{ {
@ -1754,7 +1756,7 @@ const gamemode_info_t gamemode_info[] = {
//rogue/hipnotic have no special files - the detection conflicts and stops us from running regular quake //rogue/hipnotic have no special files - the detection conflicts and stops us from running regular quake
//protocol name(dpmaster) exename cmdline switch identifying file exec dir1 dir2 dir3 dir(fte) full name //protocol name(dpmaster) exename cmdline switch identifying file exec dir1 dir2 dir3 dir(fte) full name
{"Darkplaces-Quake", "q1", "-quake", {"id1/pak0.pak"}, NULL, {"id1", "qw", "fte"}, "Quake"}, {"DarkPlaces-Quake", "q1", "-quake", {"id1/pak0.pak"}, NULL, {"id1", "qw", "fte"}, "Quake"},
{"Darkplaces-Hipnotic", "hipnotic", "-hipnotic", {NULL}, NULL, {"id1", "qw", "hipnotic", "fte"}, "Quake: Scourge of Armagon"}, {"Darkplaces-Hipnotic", "hipnotic", "-hipnotic", {NULL}, NULL, {"id1", "qw", "hipnotic", "fte"}, "Quake: Scourge of Armagon"},
{"Darkplaces-Rogue", "rogue", "-rogue", {NULL}, NULL, {"id1", "qw", "rogue", "fte"}, "Quake: Dissolution of Eternity"}, {"Darkplaces-Rogue", "rogue", "-rogue", {NULL}, NULL, {"id1", "qw", "rogue", "fte"}, "Quake: Dissolution of Eternity"},
{"Nexuiz", "nexuiz", "-nexuiz", {"nexuiz.exe"}, NEXCFG, {"data", "ftedata"}, "Nexuiz"}, {"Nexuiz", "nexuiz", "-nexuiz", {"nexuiz.exe"}, NEXCFG, {"data", "ftedata"}, "Nexuiz"},
@ -2035,7 +2037,7 @@ void FS_AddRootWads(void)
if (!pak) if (!pak)
return; return;
FS_AddPathHandle(fname, fname, &doomwadfilefuncs, pak, true, false, false, (unsigned int)-1); FS_AddPathHandle(fname, fname, &doomwadfilefuncs, pak, true, false, true, (unsigned int)-1);
} }
#endif #endif
@ -2053,7 +2055,7 @@ void FS_ReloadPackFilesFlags(unsigned int reloadflags)
searchpath_t *next; searchpath_t *next;
//a lame way to fix pure paks //a lame way to fix pure paks (securitywise, the rest of the engine doesn't care if the filesystem changes too much)
#ifndef SERVERONLY #ifndef SERVERONLY
if (cls.state && com_purepaths) if (cls.state && com_purepaths)
{ {
@ -2093,10 +2095,10 @@ void FS_ReloadPackFilesFlags(unsigned int reloadflags)
if (oldbase == oldpaths) if (oldbase == oldpaths)
com_base_searchpaths = com_searchpaths; com_base_searchpaths = com_searchpaths;
if (oldpaths->funcs == &osfilefuncs) if (oldpaths->isexplicit)
FS_AddGameDirectory(oldpaths->purepath, oldpaths->handle, reloadflags); FS_AddPathHandle(oldpaths->purepath, oldpaths->purepath, oldpaths->funcs, oldpaths->handle, oldpaths->copyprotected, false, true, reloadflags);
else
oldpaths->funcs->ClosePath(oldpaths->handle); oldpaths->funcs->ClosePath(oldpaths->handle);
Z_Free(oldpaths); Z_Free(oldpaths);
oldpaths = next; oldpaths = next;
} }
@ -2390,7 +2392,7 @@ void FS_Shutdown(void)
void FS_StartupWithGame(int gamenum) void FS_StartupWithGame(int gamenum)
{ {
int i; int i, j;
#ifdef AVAIL_ZLIB #ifdef AVAIL_ZLIB
LibZ_Init(); LibZ_Init();
@ -2403,6 +2405,47 @@ void FS_StartupWithGame(int gamenum)
FS_AddRootWads(); FS_AddRootWads();
#endif #endif
i = COM_CheckParm ("-basepack");
while (i && i < com_argc-1)
{
// Con_Printf("found -basepack: %s\n", com_argv[i+1]);
char *ext = COM_FileExtension(com_argv[i+1]);
vfsfile_t *vfs = VFSOS_Open(com_argv[i+1], "rb");
void *pak;
if (!vfs)
Con_Printf("Unable to open %s - missing?\n", com_argv[i+1]);
else
{
for (j = 0; j < sizeof(searchpathformats)/sizeof(searchpathformats[0]); j++)
{
if (!searchpathformats[j].extension || !searchpathformats[j].funcs || !searchpathformats[j].funcs->OpenNew)
continue;
if (!strcmp(ext, searchpathformats[j].extension))
{
pak = searchpathformats[j].funcs->OpenNew(vfs, com_argv[i+1]);
if (pak)
{
FS_AddPathHandle("", com_argv[i+1], searchpathformats[j].funcs, pak, true, false, true, (unsigned int)-1);
}
else
{
Con_Printf("Unable to open %s - corrupt?\n", com_argv[i+1]);
VFS_CLOSE(vfs);
}
vfs = NULL;
break;
}
}
if (vfs)
{
VFS_CLOSE(vfs);
Con_Printf("Unable to open %s - unsupported?\n", com_argv[i+1]);
}
}
i = COM_CheckNextParm ("-basepack", i);
}
// //
// start up with id1 by default // start up with id1 by default
// //
@ -2734,16 +2777,18 @@ extern searchpathfuncs_t zipfilefuncs;
extern searchpathfuncs_t doomwadfilefuncs; extern searchpathfuncs_t doomwadfilefuncs;
void FS_RegisterDefaultFileSystems(void) void FS_RegisterDefaultFileSystems(void)
{ {
FS_RegisterFileSystemType("pak", &packfilefuncs); FS_RegisterFileSystemType("pak", &packfilefuncs, true);
#if !defined(_WIN32) && !defined(ANDROID) #if !defined(_WIN32) && !defined(ANDROID)
/*for systems that have case sensitive paths, also include *.PAK */ /*for systems that have case sensitive paths, also include *.PAK */
FS_RegisterFileSystemType("PAK", &packfilefuncs); FS_RegisterFileSystemType("PAK", &packfilefuncs, true);
#endif #endif
#ifdef AVAIL_ZLIB #ifdef AVAIL_ZLIB
FS_RegisterFileSystemType("pk3", &zipfilefuncs); FS_RegisterFileSystemType("pk3", &zipfilefuncs, true);
FS_RegisterFileSystemType("pk4", &zipfilefuncs); FS_RegisterFileSystemType("pk4", &zipfilefuncs, true);
FS_RegisterFileSystemType("apk", &zipfilefuncs, false);
FS_RegisterFileSystemType("zip", &zipfilefuncs, false);
#endif #endif
#ifdef DOOMWADS #ifdef DOOMWADS
FS_RegisterFileSystemType("wad", &doomwadfilefuncs); FS_RegisterFileSystemType("wad", &doomwadfilefuncs, true);
#endif #endif
} }

View File

@ -27,5 +27,5 @@ extern searchpathfuncs_t osfilefuncs;
vfsfile_t *VFSOS_Open(const char *osname, const char *mode); vfsfile_t *VFSOS_Open(const char *osname, const char *mode);
vfsfile_t *FS_DecompressGZip(vfsfile_t *infile); vfsfile_t *FS_DecompressGZip(vfsfile_t *infile);
int FS_RegisterFileSystemType(const char *extension, searchpathfuncs_t *funcs); int FS_RegisterFileSystemType(const char *extension, searchpathfuncs_t *funcs, qboolean loadscan);
void FS_UnRegisterFileSystemType(int idx); void FS_UnRegisterFileSystemType(int idx);

View File

@ -246,6 +246,7 @@ void *FSPAK_LoadPackFile (vfsfile_t *file, const char *desc)
CRC_ProcessByte(&crc, ((qbyte *)&info)[j]); CRC_ProcessByte(&crc, ((qbyte *)&info)[j]);
*/ */
strcpy (newfiles[i].name, info.name); strcpy (newfiles[i].name, info.name);
newfiles[i].name[MAX_QPATH-1] = 0; //paranoid
COM_CleanUpPath(newfiles[i].name); //blooming tanks. COM_CleanUpPath(newfiles[i].name); //blooming tanks.
newfiles[i].filepos = LittleLong(info.filepos); newfiles[i].filepos = LittleLong(info.filepos);
newfiles[i].filelen = LittleLong(info.filelen); newfiles[i].filelen = LittleLong(info.filelen);

View File

@ -602,6 +602,10 @@ qboolean VFSZIP_Seek (struct vfsfile_s *file, unsigned long pos)
vfsz->parent->currentfile = NULL; //make it not us, so the next read starts at the right place vfsz->parent->currentfile = NULL; //make it not us, so the next read starts at the right place
} }
} }
else
{
vfsz->parent->currentfile = NULL;
}
if (pos < 0 || pos > vfsz->length) if (pos < 0 || pos > vfsz->length)
return false; return false;

View File

@ -935,32 +935,42 @@ void QCBUILTIN PF_fgets (progfuncs_t *prinst, struct globalvars_s *pr_globals)
G_INT(OFS_RETURN) = PR_SetString(prinst, pf_fopen_files[fnum].data); G_INT(OFS_RETURN) = PR_SetString(prinst, pf_fopen_files[fnum].data);
return; return;
} }
//read up to the next \n, ignoring any \rs. if (pf_fopen_files[fnum].accessmode == FRIK_FILE_READNL)
o = pr_string_temp;
max = o + sizeof(pr_string_temp)-1;
s = pf_fopen_files[fnum].data+pf_fopen_files[fnum].ofs;
eof = pf_fopen_files[fnum].data+pf_fopen_files[fnum].len;
while(s < eof)
{ {
c = *s++; if (pf_fopen_files[fnum].ofs >= pf_fopen_files[fnum].len)
if (c == '\n' && pf_fopen_files[fnum].accessmode != FRIK_FILE_READNL) G_INT(OFS_RETURN) = 0; //EOF
break; else
if (c == '\r' && pf_fopen_files[fnum].accessmode != FRIK_FILE_READNL) RETURN_TSTRING(pf_fopen_files[fnum].data);
continue;
if (o == max)
break;
*o++ = c;
} }
*o = '\0';
pf_fopen_files[fnum].ofs = s - pf_fopen_files[fnum].data;
if (!pr_string_temp[0] && s == eof)
G_INT(OFS_RETURN) = 0; //EOF
else else
RETURN_TSTRING(pr_string_temp); {
//read up to the next \n, ignoring any \rs.
o = pr_string_temp;
max = o + sizeof(pr_string_temp)-1;
s = pf_fopen_files[fnum].data+pf_fopen_files[fnum].ofs;
eof = pf_fopen_files[fnum].data+pf_fopen_files[fnum].len;
while(s < eof)
{
c = *s++;
if (c == '\n' && pf_fopen_files[fnum].accessmode != FRIK_FILE_READNL)
break;
if (c == '\r' && pf_fopen_files[fnum].accessmode != FRIK_FILE_READNL)
continue;
if (o == max)
break;
*o++ = c;
}
*o = '\0';
pf_fopen_files[fnum].ofs = s - pf_fopen_files[fnum].data;
if (!pr_string_temp[0] && s >= eof)
G_INT(OFS_RETURN) = 0; //EOF
else
RETURN_TSTRING(pr_string_temp);
}
} }
static void PF_fwrite (progfuncs_t *prinst, int fnum, char *msg, int len) static void PF_fwrite (progfuncs_t *prinst, int fnum, char *msg, int len)
@ -1833,64 +1843,98 @@ void QCBUILTIN PF_forgetstring(progfuncs_t *prinst, struct globalvars_s *pr_glob
void QCBUILTIN PF_dupstring(progfuncs_t *prinst, struct globalvars_s *pr_globals) //frik_file void QCBUILTIN PF_dupstring(progfuncs_t *prinst, struct globalvars_s *pr_globals) //frik_file
{ {
char *s, *in; char *buf;
int len; int len = 0;
in = PF_VarString(prinst, 0, pr_globals); char *s[8];
len = strlen(in)+1; int l[8];
s = Z_TagMalloc(len+8, Z_QC_TAG); int i;
((int *)s)[0] = PRSTR; for (i = 0; i < *prinst->callargc; i++)
((int *)s)[1] = len; {
strcpy(s+8, in); s[i] = PR_GetStringOfs(prinst, OFS_PARM0+i*3);
RETURN_SSTRING(s+8); l[i] = strlen(s[i]);
len += l[i];
}
len++; /*for the null*/
buf = Z_TagMalloc(len+8, Z_QC_TAG);
RETURN_SSTRING(buf+8);
((int *)buf)[0] = PRSTR;
((int *)buf)[1] = len;
buf += 8;
len = 0;
for (i = 0; i < *prinst->callargc; i++)
{
memcpy(buf, s[i], l[i]);
buf += l[i];
}
*buf = '\0';
}
//string(string str1, string str2) strcat
void QCBUILTIN PF_strcat (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
char *buf;
int len = 0;
char *s[8];
int l[8];
int i;
for (i = 0; i < *prinst->callargc; i++)
{
s[i] = PR_GetStringOfs(prinst, OFS_PARM0+i*3);
l[i] = strlen(s[i]);
len += l[i];
}
len++; /*for the null*/
((int *)pr_globals)[OFS_RETURN] = prinst->AllocTempString(prinst, &buf, len);
len = 0;
for (i = 0; i < *prinst->callargc; i++)
{
memcpy(buf, s[i], l[i]);
buf += l[i];
}
*buf = '\0';
} }
//returns a section of a string as a tempstring //returns a section of a string as a tempstring
void QCBUILTIN PF_substring (progfuncs_t *prinst, struct globalvars_s *pr_globals) void QCBUILTIN PF_substring (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{ {
int i, start, length; int start, length, slen;
char *s; char *s;
char string[4096]; char *string;
s = PR_GetStringOfs(prinst, OFS_PARM0); s = PR_GetStringOfs(prinst, OFS_PARM0);
start = G_FLOAT(OFS_PARM1); start = G_FLOAT(OFS_PARM1);
length = G_FLOAT(OFS_PARM2); length = G_FLOAT(OFS_PARM2);
slen = strlen(s);
if (start < 0) if (start < 0)
start = strlen(s)-start; start = slen-start;
if (length < 0) if (length < 0)
length = strlen(s)-start+(length+1); length = slen-start+(length+1);
if (start < 0) if (start < 0)
{ {
// length += start; // length += start;
start = 0; start = 0;
} }
if (start >= strlen(s) || length<=0 || !*s) if (start >= slen || length<=0)
{ {
RETURN_TSTRING(""); RETURN_TSTRING("");
return; return;
} }
if (length >= MAXTEMPBUFFERLEN) s += start;
length = MAXTEMPBUFFERLEN-1; slen -= start;
for (i = 0; i < start && *s; i++, s++) if (length > slen)
; length = slen;
for (i = 0; *s && i < length; i++, s++) ((int *)pr_globals)[OFS_RETURN] = prinst->AllocTempString(prinst, &string, length+1);
string[i] = *s;
string[i] = 0;
RETURN_TSTRING(string); memcpy(string, s, length);
} string[length] = '\0';
//string(string str1, string str2) strcat
void QCBUILTIN PF_strcat (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
char dest[4096];
char *src = PF_VarString(prinst, 0, pr_globals);
Q_strncpyz(dest, src, MAXTEMPBUFFERLEN);
RETURN_TSTRING(dest);
} }
void QCBUILTIN PF_strlen(progfuncs_t *prinst, struct globalvars_s *pr_globals) void QCBUILTIN PF_strlen(progfuncs_t *prinst, struct globalvars_s *pr_globals)

View File

@ -395,13 +395,13 @@ enum clcq2_ops_e
#define PF_EXTRA_PFS (1<<15) #define PF_EXTRA_PFS (1<<15)
#ifdef PEXT_SCALE #ifdef PEXT_SCALE
#define PF_SCALE_Z (1<<16) #define PF_SCALE (1<<16)
#endif #endif
#ifdef PEXT_TRANS #ifdef PEXT_TRANS
#define PF_TRANS_Z (1<<17) #define PF_TRANS (1<<17)
#endif #endif
#ifdef PEXT_FATNESS #ifdef PEXT_FATNESS
#define PF_FATNESS_Z (1<<18) #define PF_FATNESS (1<<18)
#endif #endif
#define PF_COLOURMOD (1<<19) #define PF_COLOURMOD (1<<19)

View File

@ -20,6 +20,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fteqcc", "..\qclib\dotnet20
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qtvprox", "..\..\fteqtv\dotnet2005\qtvprox.vcproj", "{62669E6C-7E18-4E4D-BA54-DFBE29E7D24E}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qtvprox", "..\..\fteqtv\dotnet2005\qtvprox.vcproj", "{62669E6C-7E18-4E4D-BA54-DFBE29E7D24E}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "droid", "droid\droid.vcproj", "{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
D3DDebug|Win32 = D3DDebug|Win32 D3DDebug|Win32 = D3DDebug|Win32
@ -296,6 +298,30 @@ Global
{62669E6C-7E18-4E4D-BA54-DFBE29E7D24E}.Release|Win32.ActiveCfg = Release|Win32 {62669E6C-7E18-4E4D-BA54-DFBE29E7D24E}.Release|Win32.ActiveCfg = Release|Win32
{62669E6C-7E18-4E4D-BA54-DFBE29E7D24E}.Release|Win32.Build.0 = Release|Win32 {62669E6C-7E18-4E4D-BA54-DFBE29E7D24E}.Release|Win32.Build.0 = Release|Win32
{62669E6C-7E18-4E4D-BA54-DFBE29E7D24E}.Release|x64.ActiveCfg = Release|Win32 {62669E6C-7E18-4E4D-BA54-DFBE29E7D24E}.Release|x64.ActiveCfg = Release|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.D3DDebug|Win32.ActiveCfg = Debug|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.D3DDebug|x64.ActiveCfg = Debug|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.D3DRelease|Win32.ActiveCfg = Release|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.D3DRelease|x64.ActiveCfg = Release|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.Debug Dedicated Server|Win32.ActiveCfg = Debug|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.Debug Dedicated Server|x64.ActiveCfg = Debug|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.Debug|Win32.ActiveCfg = Debug|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.Debug|x64.ActiveCfg = Debug|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.GLDebug|Win32.ActiveCfg = Debug|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.GLDebug|x64.ActiveCfg = Debug|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.GLRelease|Win32.ActiveCfg = Release|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.GLRelease|x64.ActiveCfg = Release|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.MDebug|Win32.ActiveCfg = Debug|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.MDebug|x64.ActiveCfg = Debug|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.MinGLDebug|Win32.ActiveCfg = Debug|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.MinGLDebug|x64.ActiveCfg = Debug|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.MinGLRelease|Win32.ActiveCfg = Release|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.MinGLRelease|x64.ActiveCfg = Release|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.MRelease|Win32.ActiveCfg = Release|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.MRelease|x64.ActiveCfg = Release|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.Release Dedicated Server|Win32.ActiveCfg = Release|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.Release Dedicated Server|x64.ActiveCfg = Release|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.Release|Win32.ActiveCfg = Release|Win32
{AA9D4AA8-2B98-42A8-9F63-B9E5A6221BB6}.Release|x64.ActiveCfg = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@ -664,6 +664,7 @@
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="1" RuntimeLibrary="1"
EnableFunctionLevelLinking="true" EnableFunctionLevelLinking="true"
EnableEnhancedInstructionSet="0"
FloatingPointModel="2" FloatingPointModel="2"
UsePrecompiledHeader="2" UsePrecompiledHeader="2"
PrecompiledHeaderThrough="quakedef.h" PrecompiledHeaderThrough="quakedef.h"
@ -1683,6 +1684,7 @@
StringPooling="true" StringPooling="true"
ExceptionHandling="0" ExceptionHandling="0"
BufferSecurityCheck="false" BufferSecurityCheck="false"
EnableEnhancedInstructionSet="2"
FloatingPointModel="2" FloatingPointModel="2"
RuntimeTypeInfo="false" RuntimeTypeInfo="false"
UsePrecompiledHeader="2" UsePrecompiledHeader="2"

View File

@ -32,6 +32,21 @@ public class FTEDroidActivity extends Activity
private class FTERenderer implements GLSurfaceView.Renderer private class FTERenderer implements GLSurfaceView.Renderer
{ {
private boolean inited; private boolean inited;
private String basedir;
FTERenderer(Context ctx)
{
try
{
android.content.pm.PackageInfo info = ctx.getPackageManager().getPackageInfo("com.fteqw", 0);
basedir = info.applicationInfo.sourceDir;
}
catch(android.content.pm.PackageManager.NameNotFoundException e)
{
/*oh well, can just use the homedir instead*/
}
}
@Override @Override
public void onDrawFrame(GL10 gl) public void onDrawFrame(GL10 gl)
{ {
@ -43,7 +58,7 @@ public class FTEDroidActivity extends Activity
@Override @Override
public void onSurfaceChanged(GL10 gl, int width, int height) public void onSurfaceChanged(GL10 gl, int width, int height)
{ {
FTEDroidEngine.init(width, height); FTEDroidEngine.init(width, height, basedir);
inited = true; inited = true;
} }
@Override @Override
@ -135,7 +150,7 @@ public class FTEDroidActivity extends Activity
{ {
super(context); super(context);
rndr = new FTERenderer(); rndr = new FTERenderer(getContext());
// setEGLConfigChooser(new FTEEGLConfig()); // setEGLConfigChooser(new FTEEGLConfig());
setRenderer(rndr); setRenderer(rndr);
setFocusable(true); setFocusable(true);

View File

@ -2,7 +2,7 @@ package com.fteqw;
public class FTEDroidEngine public class FTEDroidEngine
{ {
public static native void init(int w, int h); /* init/reinit */ public static native void init(int w, int h, String basedir); /* init/reinit */
public static native void frame(); public static native void frame();
public static native void keypress(int down, int qkey, int unicode); public static native void keypress(int down, int qkey, int unicode);
public static native void motion(int act, float x, float y); public static native void motion(int act, float x, float y);

View File

@ -443,6 +443,8 @@ notimplemented:
{ {
VFS_CLOSE(cl->file); VFS_CLOSE(cl->file);
cl->file = NULL; cl->file = NULL;
IWebPrintf("Download complete\n");
} }
else else
cl->outbufferused+=ammount; cl->outbufferused+=ammount;

View File

@ -813,10 +813,17 @@ reeval:
i = (unsigned int)OPA->_int + (unsigned int)OPB->_float; i = (unsigned int)OPA->_int + (unsigned int)OPB->_float;
if ((unsigned int)i >= addressableused) if ((unsigned int)i >= addressableused)
{ {
pr_xstatement = st-pr_statements; i = (unsigned int)OPB->_float;
PR_RunError (progfuncs, "bad pointer read in %s", PR_StringToNative(progfuncs, pr_xfunction->s_name)); ptr = (eval_t*)PR_StringToNative(progfuncs, OPA->_int);
if (i > strlen((char*)ptr))
{
pr_xstatement = st-pr_statements;
PR_RunError (progfuncs, "bad pointer read in %s (%i bytes into %s)", PR_StringToNative(progfuncs, pr_xfunction->s_name), i, ptr);
}
ptr = (eval_t*)((char*)ptr + i);
} }
ptr = QCPOINTERM(i); else
ptr = QCPOINTERM(i);
OPC->_float = *(unsigned char *)ptr; OPC->_float = *(unsigned char *)ptr;
break; break;
case OP_LOADP_I: case OP_LOADP_I:

View File

@ -658,6 +658,38 @@ string_t PR_AllocTempString (progfuncs_t *progfuncs, char *str)
return (string_t)((unsigned int)i | 0x40000000); return (string_t)((unsigned int)i | 0x40000000);
} }
string_t PR_AllocTempStringLen (progfuncs_t *progfuncs, char **str, int len)
{
char **ntable;
int newmax;
int i;
if (!str)
return 0;
if (prinst->numtempstrings == prinst->maxtempstrings)
{
newmax = prinst->maxtempstrings += 1024;
prinst->maxtempstrings += 1024;
ntable = memalloc(sizeof(char*) * newmax);
memcpy(ntable, prinst->tempstrings, sizeof(char*) * prinst->numtempstrings);
prinst->maxtempstrings = newmax;
if (prinst->tempstrings)
memfree(prinst->tempstrings);
prinst->tempstrings = ntable;
}
i = prinst->numtempstrings;
if (i == 0x10000000)
return 0;
prinst->numtempstrings++;
prinst->tempstrings[i] = memalloc(len);
*str = prinst->tempstrings[i];
return (string_t)((unsigned int)i | 0x40000000);
}
void PR_FreeTemps (progfuncs_t *progfuncs, int depth) void PR_FreeTemps (progfuncs_t *progfuncs, int depth)
{ {
@ -771,7 +803,8 @@ progfuncs_t deffuncs = {
PR_QueryField, PR_QueryField,
QC_ClearEdict, QC_ClearEdict,
QC_FindPrefixedGlobals, QC_FindPrefixedGlobals,
PRAddressableAlloc PRAddressableAlloc,
PR_AllocTempStringLen
}; };
#undef printf #undef printf

View File

@ -353,6 +353,8 @@ enum qcop_e {
OP_MULSTORE_VI, OP_MULSTORE_VI,
OP_MULSTOREP_VI, OP_MULSTOREP_VI,
OP_LOADA_STRUCT,
OP_NUMOPS OP_NUMOPS
}; };

View File

@ -140,6 +140,8 @@ struct progfuncs_s {
void (*FindPrefixGlobals) (progfuncs_t *progfuncs, char *prefix, void (*found) (progfuncs_t *progfuncs, char *name, union eval_s *val, etype_t type) ); void (*FindPrefixGlobals) (progfuncs_t *progfuncs, char *prefix, void (*found) (progfuncs_t *progfuncs, char *name, union eval_s *val, etype_t type) );
void *(*AddressableAlloc) (progfuncs_t *progfuncs, int ammount); /*returns memory within the qc block, use stringtoprogs to get a usable qc pointer/string*/ void *(*AddressableAlloc) (progfuncs_t *progfuncs, int ammount); /*returns memory within the qc block, use stringtoprogs to get a usable qc pointer/string*/
string_t (*AllocTempString) (progfuncs_t *prinst, char **str, unsigned int len);
}; };
typedef struct progexterns_s { typedef struct progexterns_s {

View File

@ -544,6 +544,8 @@ QCC_opcode_t pr_opcodes[] =
{7, "*=", "MULSTORE_VI", 6, ASSOC_RIGHT_RESULT, &type_vector, &type_integer, &type_vector}, {7, "*=", "MULSTORE_VI", 6, ASSOC_RIGHT_RESULT, &type_vector, &type_integer, &type_vector},
{7, "*=", "MULSTOREP_VI", 6, ASSOC_RIGHT_RESULT, &type_pointer, &type_integer, &type_vector}, {7, "*=", "MULSTOREP_VI", 6, ASSOC_RIGHT_RESULT, &type_pointer, &type_integer, &type_vector},
{7, "=", "LOADA_STRUCT", 6, ASSOC_LEFT, &type_float, &type_integer, &type_float},
{0, NULL} {0, NULL}
}; };
@ -2110,6 +2112,12 @@ QCC_def_t *QCC_PR_Statement (QCC_opcode_t *op, QCC_def_t *var_a, QCC_def_t *var_
{ {
switch(op - pr_opcodes) switch(op - pr_opcodes)
{ {
case OP_LOADA_STRUCT:
/*emit this anyway. if it reaches runtime then you messed up.
this is valid only if you do &foo[0]*/
break;
case OP_IF_S: case OP_IF_S:
var_c = QCC_PR_GetDef(type_string, "string_null", NULL, true, 0, false); var_c = QCC_PR_GetDef(type_string, "string_null", NULL, true, 0, false);
numstatements--; numstatements--;
@ -2331,6 +2339,8 @@ QCC_def_t *QCC_PR_Statement (QCC_opcode_t *op, QCC_def_t *var_a, QCC_def_t *var_
case OP_ADDSTOREP_V: case OP_ADDSTOREP_V:
case OP_SUBSTOREP_F: case OP_SUBSTOREP_F:
case OP_SUBSTOREP_I:
case OP_ADDSTOREP_I:
case OP_ADDSTOREP_F: case OP_ADDSTOREP_F:
case OP_MULSTOREP_F: case OP_MULSTOREP_F:
case OP_DIVSTOREP_F: case OP_DIVSTOREP_F:
@ -2344,35 +2354,57 @@ QCC_def_t *QCC_PR_Statement (QCC_opcode_t *op, QCC_def_t *var_a, QCC_def_t *var_
{ {
int st; int st;
int need_lock = false; int need_lock = false;
for (st = numstatements-2; st>=0; st--) if (var_b->temp)
{ {
if (statements[st].op == OP_ADDRESS) for (st = numstatements-2; st>=0; st--)
{
if (statements[st].op == OP_ADDRESS)
if (statements[st].c == var_b->ofs)
break;
if ((statements[st].op >= OP_CALL0 && statements[st].op <= OP_CALL8) || (statements[st].op >= OP_CALL1H && statements[st].op <= OP_CALL8H))
need_lock = true;
if (statements[st].c == var_b->ofs) if (statements[st].c == var_b->ofs)
{
st = -1;
break; break;
}
if ((statements[st].op >= OP_CALL0 && statements[st].op <= OP_CALL8) || (statements[st].op >= OP_CALL1H && statements[st].op <= OP_CALL8H)) }
need_lock = true;
if (statements[st].c == var_b->ofs)
QCC_PR_ParseWarning(0, "Temp-reuse may have broken your %s", op->name);
} }
if (st < 0) else
QCC_PR_ParseError(ERR_INTERNAL, "XSTOREP_F: pointer was not generated from previous statement"); st = -1;
var_c = QCC_GetTemp(*op->type_c); var_c = QCC_GetTemp(*op->type_c);
if (need_lock) if (st < 0)
QCC_LockTemp(var_c); /*that temp needs to be preserved over calls*/ {
/*generate new OP_LOADP instruction*/
statement->op = ((*op->type_c)->type==ev_vector)?OP_LOADP_V:OP_LOADP_F;
statement->a = var_b->ofs;
statement->b = var_c->ofs;
statement->c = 0;
}
else
{
/*it came from an OP_ADDRESS - st says the instruction*/
var_c = QCC_GetTemp(*op->type_c);
if (need_lock)
QCC_LockTemp(var_c); /*that temp needs to be preserved over calls*/
statement_linenums[statement-statements] = statement_linenums[st]; /*generate new OP_ADDRESS instruction - FIXME: the arguments may have changed since the original instruction*/
statement->op = OP_ADDRESS; statement_linenums[statement-statements] = statement_linenums[st];
statement->a = statements[st].a; statement->op = OP_ADDRESS;
statement->b = statements[st].b; statement->a = statements[st].a;
statement->c = statements[st].c; statement->b = statements[st].b;
statement->c = statements[st].c;
statement_linenums[st] = pr_source_line; /*convert old one to an OP_LOAD*/
statements[st].op = ((*op->type_c)->type==ev_vector)?OP_LOAD_V:OP_LOAD_F; statement_linenums[st] = pr_source_line;
statements[st].a = statements[st].a; statements[st].op = ((*op->type_c)->type==ev_vector)?OP_LOAD_V:OP_LOAD_F;
statements[st].b = statements[st].b; statements[st].a = statements[st].a;
statements[st].c = var_c->ofs; statements[st].b = statements[st].b;
statements[st].c = var_c->ofs;
}
} }
statement = &statements[numstatements]; statement = &statements[numstatements];
@ -2396,6 +2428,9 @@ QCC_def_t *QCC_PR_Statement (QCC_opcode_t *op, QCC_def_t *var_a, QCC_def_t *var_
case OP_SUBSTOREP_F: case OP_SUBSTOREP_F:
statement->op = OP_SUB_F; statement->op = OP_SUB_F;
break; break;
case OP_SUBSTOREP_I:
statement->op = OP_SUB_I;
break;
case OP_SUBSTOREP_IF: case OP_SUBSTOREP_IF:
statement->op = OP_SUB_IF; statement->op = OP_SUB_IF;
break; break;
@ -2423,6 +2458,9 @@ QCC_def_t *QCC_PR_Statement (QCC_opcode_t *op, QCC_def_t *var_a, QCC_def_t *var_
case OP_ADDSTOREP_F: case OP_ADDSTOREP_F:
statement->op = OP_ADD_F; statement->op = OP_ADD_F;
break; break;
case OP_ADDSTOREP_I:
statement->op = OP_ADD_I;
break;
case OP_MULSTOREP_F: case OP_MULSTOREP_F:
statement->op = OP_MUL_F; statement->op = OP_MUL_F;
break; break;
@ -3703,7 +3741,7 @@ QCC_def_t *QCC_PR_ParseFunctionCall (QCC_def_t *func) //warning, the func could
e = QCC_PR_Statement(pr_opcodes+OP_CONV_FTOI, e, NULL, NULL); e = QCC_PR_Statement(pr_opcodes+OP_CONV_FTOI, e, NULL, NULL);
else if (p->type == ev_float && e->type->type == ev_integer) //convert float -> int... is this a constant? else if (p->type == ev_float && e->type->type == ev_integer) //convert float -> int... is this a constant?
e = QCC_PR_Statement(pr_opcodes+OP_CONV_ITOF, e, NULL, NULL); e = QCC_PR_Statement(pr_opcodes+OP_CONV_ITOF, e, NULL, NULL);
else if (p->type == ev_function && e->type->type == ev_integer && e->constant && !((int*)qcc_pr_globals)[e->ofs]) else if ((p->type == ev_function && p->type == ev_string) && e->type->type == ev_integer && e->constant && !((int*)qcc_pr_globals)[e->ofs])
{ //you're allowed to use int 0 to pass a null function pointer { //you're allowed to use int 0 to pass a null function pointer
//this is basically because __NULL__ is defined as ~0 (int 0) //this is basically because __NULL__ is defined as ~0 (int 0)
} }
@ -4448,6 +4486,11 @@ QCC_def_t *QCC_PR_ParseValue (QCC_type_t *assumeclass, pbool allowarrayassign)
case ev_function: case ev_function:
d = QCC_PR_Statement(&pr_opcodes[OP_LOADA_FNC], d, QCC_SupplyConversion(idx, ev_integer, true), NULL); d = QCC_PR_Statement(&pr_opcodes[OP_LOADA_FNC], d, QCC_SupplyConversion(idx, ev_integer, true), NULL);
break; break;
case ev_struct:
case ev_union:
//FIXME...
d = QCC_PR_Statement(&pr_opcodes[OP_LOADA_STRUCT], d, QCC_SupplyConversion(idx, ev_integer, true), NULL);
break;
default: default:
QCC_PR_ParseError(ERR_NOVALIDOPCODES, "No op available. Try assembler"); QCC_PR_ParseError(ERR_NOVALIDOPCODES, "No op available. Try assembler");
} }
@ -4846,6 +4889,15 @@ QCC_def_t *QCC_PR_Term (void)
/*you may cast from const 0 to any type of same size for free (from either int or float for simplicity)*/ /*you may cast from const 0 to any type of same size for free (from either int or float for simplicity)*/
else if (newtype->size == e->type->size && (e->type->type == ev_integer || e->type->type == ev_float) && e->constant && !G_INT(e->ofs)) else if (newtype->size == e->type->size && (e->type->type == ev_integer || e->type->type == ev_float) && e->constant && !G_INT(e->ofs))
{ {
//direct cast
e2 = (void *)qccHunkAlloc (sizeof(QCC_def_t));
memset (e2, 0, sizeof(QCC_def_t));
e2->type = newtype;
e2->ofs = e->ofs;
e2->constant = true;
e2->temp = e->temp;
return e2;
} }
/*cast from int->float will convert*/ /*cast from int->float will convert*/
else if (newtype->type == ev_float && e->type->type == ev_integer) else if (newtype->type == ev_float && e->type->type == ev_integer)
@ -4993,6 +5045,9 @@ int QCC_canConv(QCC_def_t *from, etype_t to)
if (from->type->type == ev_integer && to == ev_function) if (from->type->type == ev_integer && to == ev_function)
return 1; return 1;
if (from->constant && from->arraysize == 0 && (from->type->type == ev_integer || from->type->type == ev_float) && !G_INT(from->ofs))
return 2;
return -100; return -100;
} }
/* /*

View File

@ -1664,6 +1664,11 @@ void QCC_PR_BeginCompilation (void *memory, int memsize)
type_floatfield->aux_type = type_float; type_floatfield->aux_type = type_float;
type_pointer->aux_type = QCC_PR_NewType("pointeraux", ev_float); type_pointer->aux_type = QCC_PR_NewType("pointeraux", ev_float);
type_intpointer = QCC_PR_NewType("__intpointer", ev_pointer);
type_intpointer->aux_type = type_integer;
type_floatpointer = QCC_PR_NewType("__floatpointer", ev_pointer);
type_floatpointer->aux_type = type_float;
type_function->aux_type = type_void; type_function->aux_type = type_void;
//type_field->aux_type = type_float; //type_field->aux_type = type_float;

View File

@ -1232,19 +1232,19 @@ void SV_WritePlayerToClient(sizebuf_t *msg, clstate_t *ent)
#ifdef PEXT_SCALE //this is graphics, not physics #ifdef PEXT_SCALE //this is graphics, not physics
if (ent->fteext & PEXT_SCALE) if (ent->fteext & PEXT_SCALE)
{ {
if (ent->scale && ent->scale != 1) pflags |= PF_SCALE_Z; if (ent->scale && ent->scale != 1) pflags |= PF_SCALE;
} }
#endif #endif
#ifdef PEXT_TRANS #ifdef PEXT_TRANS
if (ent->fteext & PEXT_TRANS) if (ent->fteext & PEXT_TRANS)
{ {
if (ent->transparency) pflags |= PF_TRANS_Z; if (ent->transparency) pflags |= PF_TRANS;
} }
#endif #endif
#ifdef PEXT_FATNESS #ifdef PEXT_FATNESS
if (ent->fteext & PEXT_FATNESS) if (ent->fteext & PEXT_FATNESS)
{ {
if (ent->fatness) pflags |= PF_FATNESS_Z; if (ent->fatness) pflags |= PF_FATNESS;
} }
#endif #endif
} }
@ -1384,16 +1384,16 @@ void SV_WritePlayerToClient(sizebuf_t *msg, clstate_t *ent)
MSG_WriteByte (msg, ent->weaponframe); MSG_WriteByte (msg, ent->weaponframe);
#ifdef PEXT_SCALE #ifdef PEXT_SCALE
if (pflags & PF_SCALE_Z) if (pflags & PF_SCALE)
MSG_WriteByte (msg, ent->scale*50); MSG_WriteByte (msg, ent->scale*50);
#endif #endif
#ifdef PEXT_TRANS #ifdef PEXT_TRANS
if (pflags & PF_TRANS_Z) if (pflags & PF_TRANS)
MSG_WriteByte (msg, (qbyte)(ent->transparency*255)); MSG_WriteByte (msg, (qbyte)(ent->transparency*255));
#endif #endif
#ifdef PEXT_FATNESS #ifdef PEXT_FATNESS
if (pflags & PF_FATNESS_Z) if (pflags & PF_FATNESS)
MSG_WriteChar (msg, ent->fatness*10); MSG_WriteChar (msg, ent->fatness);
#endif #endif
#ifdef PEXT_HULLSIZE //shrunken or crouching in halflife levels. (possibly enlarged) #ifdef PEXT_HULLSIZE //shrunken or crouching in halflife levels. (possibly enlarged)
if (pflags & PF_HULLSIZE_Z) if (pflags & PF_HULLSIZE_Z)
@ -2337,7 +2337,7 @@ void SV_Snapshot_BuildStateQ1(entity_state_t *state, edict_t *ent, client_t *cli
} }
#endif #endif
#ifdef PEXT_FATNESS #ifdef PEXT_FATNESS
state->fatness = ent->xv->fatness*16; state->fatness = ent->xv->fatness;
#endif #endif
} }

View File

@ -1055,18 +1055,6 @@ void SVC_Status (void)
slots++; slots++;
} }
//No. Not a good idea.
/* if (slots>16)
Con_Printf ("5016 35 54 114 \"annigilator\" \"soldier\" 0 0\n");
if (slots>14)
Con_Printf ("5012 32 85 162 \"FatBastard\" \"hacker\" 1 4\n");
if (slots>12)
Con_Printf ("5013 23 64 94 \"DeathBunny\" \"soldier\" 13 13\n");
if (slots>10)
Con_Printf ("5010 32 85 162 \"??\" \"hacker\" 13 13\n");
if (slots>8)
Con_Printf ("5011 32 85 162 \"??a???\" \"hacker\" 4 4\n");
*/
SV_EndRedirect (); SV_EndRedirect ();
} }
@ -1083,6 +1071,9 @@ void SVC_GetInfo (char *challenge, int fullstatus)
char *gamestatus; char *gamestatus;
eval_t *v; eval_t *v;
if (!sv_listen_nq.ival && !sv_listen_dp.ival)
return;
for (i=0 ; i<MAX_CLIENTS ; i++) for (i=0 ; i<MAX_CLIENTS ; i++)
{ {
cl = &svs.clients[i]; cl = &svs.clients[i];
@ -1118,7 +1109,7 @@ void SVC_GetInfo (char *challenge, int fullstatus)
//first line is the serverinfo //first line is the serverinfo
Q_strncpyz(resp, svs.info, sizeof(response) - (resp-response)); Q_strncpyz(resp, svs.info, sizeof(response) - (resp-response));
//this is a DP protocol, so some QW fields are not needed //this is a DP protocol query, so some QW fields are not needed
Info_RemoveKey(resp, "maxclients"); Info_RemoveKey(resp, "maxclients");
Info_RemoveKey(resp, "map"); Info_RemoveKey(resp, "map");
Info_SetValueForKey(resp, "gamename", com_protocolname.string, sizeof(response) - (resp-response)); Info_SetValueForKey(resp, "gamename", com_protocolname.string, sizeof(response) - (resp-response));
@ -4336,7 +4327,7 @@ void Master_Heartbeat (void)
} }
break; break;
case MP_DARKPLACES: case MP_DARKPLACES:
if (sv_listen_dp.value) //set listen to 1 to allow qw connections, 2 to allow nq connections too. if (sv_listen_dp.value || sv_listen_nq.value) //set listen to 1 to allow qw connections, 2 to allow nq connections too.
{ {
if (sv_reportheartbeats.value) if (sv_reportheartbeats.value)
Con_Printf ("Sending heartbeat to %s (%s)\n", NET_AdrToString (adr, sizeof(adr), sv_masterlist[i].adr), sv_masterlist[i].cv.string); Con_Printf ("Sending heartbeat to %s (%s)\n", NET_AdrToString (adr, sizeof(adr), sv_masterlist[i].adr), sv_masterlist[i].cv.string);

View File

@ -1937,9 +1937,6 @@ void SV_UpdateToReliableMessages (void)
char oname[80]; char oname[80];
Q_strncpyz(oname, host_client->name, sizeof(oname)); Q_strncpyz(oname, host_client->name, sizeof(oname));
#pragma warningmsg("Debug line to try to find OneManClan's issue\n");
Con_Printf("DEBUG: .netname= \"%s\" -> \"%s\" (f=%x n=%p b=%p)\n", oname, name, host_client->edict->v->netname, host_client->name, host_client->namebuf);
Con_DPrintf("Client %s programatically renamed to %s\n", host_client->name, name); Con_DPrintf("Client %s programatically renamed to %s\n", host_client->name, name);
Info_SetValueForKey(host_client->userinfo, "name", name, sizeof(host_client->userinfo)); Info_SetValueForKey(host_client->userinfo, "name", name, sizeof(host_client->userinfo));
SV_ExtractFromUserinfo (host_client); SV_ExtractFromUserinfo (host_client);