@@ -836,40 +836,181 @@ bool MAPSerializer::SerializeEntities( struct qEntity_s *entityDef )
836836SerializePathNodes
837837===============
838838*/
839- bool MAPSerializer::SerializePathNodes ( struct qPath_s *pathList )
839+ bool MAPSerializer::SerializePathNodes ( struct qPath_s *pathDef )
840840{
841841 if ( !m_writeMode )
842842 {
843843 return true ;
844844 }
845845
846- qNode_t *nodeList = pathList->m_nodeList ;
847- if ( !nodeList )
846+ if ( !pathDef->m_nodeList )
848847 return true ;
849848
850- const char *pathClassname = pathList->m_pathClassname ;
851- if ( !pathClassname || !pathClassname[0 ] )
849+ if ( !pathDef->m_pathClassname || !pathDef->m_pathClassname [0 ] )
852850 return true ;
853851
854- if ( m_cordon && (
855- ( pathList->m_bboxMin .x > m_worldDef->m_vecCordonMax .x - 0.001 ) || ( pathList->m_bboxMin .y > m_worldDef->m_vecCordonMax .y - 0.001 ) || ( pathList->m_bboxMin .z > m_worldDef->m_vecCordonMax .z - 0.001 ) ||
856- ( pathList->m_bboxMax .x > m_worldDef->m_vecCordonMin .x + 0.001 ) || ( pathList->m_bboxMax .y > m_worldDef->m_vecCordonMin .y + 0.001 ) || ( pathList->m_bboxMax .z > m_worldDef->m_vecCordonMin .z + 0.001 ) ) )
852+ if ( m_cordon )
857853 {
858- return true ;
859- }
854+ const vec3_t &bbmin = pathDef->m_bboxMin ;
855+ const vec3_t &bbmax = pathDef->m_bboxMax ;
856+
857+ if (( bbmin.x > m_worldDef->m_vecCordonMax .x - 0.001 ) || ( bbmin.y > m_worldDef->m_vecCordonMax .y - 0.001 ) || ( bbmin.z > m_worldDef->m_vecCordonMax .z - 0.001 ) ||
858+ ( bbmax.x < m_worldDef->m_vecCordonMin .x + 0.001 ) || ( bbmax.y < m_worldDef->m_vecCordonMin .y + 0.001 ) || ( bbmax.z < m_worldDef->m_vecCordonMin .z + 0.001 ))
859+ {
860+ return true ;
861+ }
860862
861- // TODO: Per-node cordon check
863+ for ( qNode_s *nodeDef = pathDef->m_nodeList ; nodeDef != NULL ; nodeDef = nodeDef->next )
864+ {
865+ const vec3_t &org = nodeDef->m_vecOrigin ;
866+
867+ if (( org.x >= m_worldDef->m_vecCordonMin .x + 0 .001f && org.y >= m_worldDef->m_vecCordonMin .y + 0 .001f && org.z >= m_worldDef->m_vecCordonMin .z + 0 .001f ) &&
868+ ( org.x <= m_worldDef->m_vecCordonMax .x - 0 .001f && org.y <= m_worldDef->m_vecCordonMax .y - 0 .001f && org.z <= m_worldDef->m_vecCordonMax .z - 0 .001f ))
869+ {
870+ return true ;
871+ }
872+ }
873+ }
862874
863- for ( qNode_t *nodeDef = nodeList; nodeDef != NULL ; nodeDef = nodeDef->next )
875+ int nodeIdx = 0 ;
876+ for ( qNode_t *nodeDef = pathDef->m_nodeList ; nodeDef != NULL ; nodeDef = nodeDef->next )
864877 {
865878 fprintf ( m_fileHandle, " %s\n " , " {" );
866879
867- // TODO
880+ fprintf ( m_fileHandle, " \" classname\" \" %s\"\n " , pathDef->m_pathClassname );
881+
882+ if ( nodeDef->m_nameOverride && nodeDef->m_nameOverride [0 ] )
883+ {
884+ fprintf ( m_fileHandle, " \" targetname\" \" %s\"\n " , nodeDef->m_nameOverride );
885+
886+ if ( nodeDef == pathDef->m_nodeList )
887+ {
888+ ++nodeIdx;
889+ }
890+ }
891+ else
892+ {
893+ if ( nodeIdx != 0 )
894+ {
895+ fprintf ( m_fileHandle, " \" targetname\" \" %s_%i\"\n " , pathDef->m_pathName , nodeIdx );
896+ }
897+ else
898+ {
899+ fprintf ( m_fileHandle, " \" targetname\" \" %s\"\n " , pathDef->m_pathName );
900+ }
901+
902+ ++nodeIdx;
903+ }
904+
905+ if ( nodeDef->next )
906+ {
907+ if ( nodeDef->next ->m_nameOverride && nodeDef->next ->m_nameOverride [0 ] )
908+ {
909+ fprintf ( m_fileHandle, " \" target\" \" %s\"\n " , nodeDef->next ->m_nameOverride );
910+ }
911+ else
912+ {
913+ fprintf ( m_fileHandle, " \" target\" \" %s_%i\"\n " , pathDef->m_pathName , nodeIdx );
914+ }
915+ }
916+ else if ( pathDef->m_pathDirection == 1 )
917+ {
918+ const char *target = pathDef->m_nodeList ->m_nameOverride ;
919+
920+ if ( !target || !target[0 ] )
921+ {
922+ target = pathDef->m_pathName ;
923+ }
924+
925+ fprintf ( m_fileHandle, " \" target\" \" %s\"\n " , target );
926+ }
927+ else if ( pathDef->m_pathDirection == 2 && nodeDef->prev )
928+ {
929+ fprintf ( m_fileHandle, " \" target\" \" %s_%i\"\n " , pathDef->m_pathName , nodeIdx );
930+ }
931+
932+ for ( epair_s *epairs = nodeDef->epairs ; epairs != NULL ; epairs = epairs->next )
933+ {
934+ if ( epairs->key && epairs->value )
935+ {
936+ fprintf ( m_fileHandle, " \" %s\" \" %s\"\n " , epairs->key , epairs->value );
937+ }
938+ }
939+
940+ #if JACK_API_VERSION >= API_VERSION_STEAM_BETA
941+ fprintf ( m_fileHandle, " \" origin\" \" %s %s %s\"\n " , Sys_PrintMapCoordVector3D ( nodeDef->m_vecOrigin ) );
942+ #else
943+ fprintf ( m_fileHandle, " \" origin\" \" %g %g %g\"\n " , Sys_PrintVector3D ( nodeDef->m_vecOrigin ) );
944+ #endif // JACK_API_VERSION >= API_VERSION_STEAM_BETA
945+
946+ const vec3_t &ang = nodeDef->m_vecAngles ;
947+ if ( ang.x != 0 .f || ang.y != 0 .f || ang.z != 0 .f )
948+ {
949+ fprintf ( m_fileHandle, " \" angles\" \" %.0f %.0f %.0f\"\n " , Sys_PrintVector3D ( ang ) );
950+ }
951+
952+ if ( nodeDef->m_fireEntityOnPass && nodeDef->m_fireEntityOnPass [0 ] )
953+ {
954+ fprintf ( m_fileHandle, " \" message\" \" %s\"\n " , nodeDef->m_fireEntityOnPass );
955+ }
868956
869957 fprintf ( m_fileHandle, " %s\n " , " }" );
870958 }
871959
872- // TODO
960+ if ( pathDef->m_pathDirection == 2 )
961+ {
962+ for ( qNode_s *nodeDef = pathDef->m_lastNode ->prev ; nodeDef != NULL ; nodeDef = nodeDef->prev )
963+ {
964+ fprintf ( m_fileHandle, " %s\n " , " {" );
965+
966+ fprintf ( m_fileHandle, " \" classname\" \" %s\"\n " , pathDef->m_pathClassname );
967+
968+ fprintf ( m_fileHandle, " \" targetname\" \" %s_%i\"\n " , pathDef->m_pathName , nodeIdx++ );
969+
970+ if ( nodeDef->prev ->prev != NULL )
971+ {
972+ fprintf ( m_fileHandle, " \" target\" \" %s_%i\"\n " , pathDef->m_pathName , nodeIdx );
973+ }
974+ else
975+ {
976+ const char *target = pathDef->m_nodeList ->m_nameOverride ;
977+
978+ if ( !target || !target[0 ] )
979+ {
980+ target = pathDef->m_pathName ;
981+ }
982+
983+ fprintf ( m_fileHandle, " \" target\" \" %s\"\n " , target );
984+ }
985+
986+ for ( epair_s *epairs = nodeDef->epairs ; epairs != NULL ; epairs = epairs->next )
987+ {
988+ if ( epairs->key && epairs->value )
989+ {
990+ fprintf ( m_fileHandle, " \" %s\" \" %s\"\n " , epairs->key , epairs->value );
991+ }
992+ }
993+
994+ #if JACK_API_VERSION >= API_VERSION_STEAM_BETA
995+ fprintf ( m_fileHandle, " \" origin\" \" %s %s %s\"\n " , Sys_PrintMapCoordVector3D ( nodeDef->m_vecOrigin ) );
996+ #else
997+ fprintf ( m_fileHandle, " \" origin\" \" %g %g %g\"\n " , Sys_PrintVector3D ( nodeDef->m_vecOrigin ) );
998+ #endif // JACK_API_VERSION >= API_VERSION_STEAM_BETA
999+
1000+ const vec3_t &ang = nodeDef->m_vecAngles ;
1001+ if ( ang.x != 0 .f || ang.y != 0 .f || ang.z != 0 .f )
1002+ {
1003+ fprintf ( m_fileHandle, " \" angles\" \" %.0f %.0f %.0f\"\n " , Sys_PrintVector3D ( ang ) );
1004+ }
1005+
1006+ if ( nodeDef->m_fireEntityOnPass && nodeDef->m_fireEntityOnPass [0 ] )
1007+ {
1008+ fprintf ( m_fileHandle, " \" message\" \" %s\"\n " , nodeDef->m_fireEntityOnPass );
1009+ }
1010+
1011+ fprintf ( m_fileHandle, " %s\n " , " }" );
1012+ }
1013+ }
8731014
8741015 return true ;
8751016}
0 commit comments